Java 8 потоков " ifPresent"
Я пытаюсь узнать о потоках и столкнулся с проблемой: Я хочу получить минимальное значение списка и назначить его переменной int. Для этого я сделал следующее:--9-->
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
int smallest = list.stream().min(Integer::compareTo).get();
System.out.println(smallest);
это работает хорошо, и я получаю 1
как результат.
Проблема в том, что IDE дает предупреждение, что Optional.get
вызывается перед проверкой .isPresent
.
Чтобы исправить это, я использовал немного другое ifPresent
метод и попробовал следующее:
int smallest = list.stream().min(Integer::compareTo).ifPresent(integer -> integer);
к сожалению, это не работает так как я получаю предупреждение:Bad return type in Lambda, Integer cannot be converted to void.
Наконец, мой вопрос: Как я могу назначить минимальное значение int smallest
переменная с проверкой ifPresent?
3 ответов
Stream#min
возвращение Optional
результата, потому что в общем потоке может быть пусто, поэтому не может быть минимального значения.
Optional<Integer> minimal = list.stream().min(Integer::compareTo);
чтобы получить значение от необязательного, вам нужно иметь некоторое резервное значение
Integer absent = Integer.MIN_VALUE;
проще всего было бы использовать orElse
Integer smallest = minimal.orElse(absent);
подольше бы isPresent
Integer smallest = minimal.isPresent() ? minimal.get() : absent;
вот как я бы это сделал:
package lambdas;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Michael
* Creation date 7/31/2016.
* @link https://stackoverflow.com/questions/38688119/java-8-streams-ifpresent
*/
public class MinimumExample {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
int smallest = list.stream().min(Integer::compareTo).orElse(Integer.MIN_VALUE);
System.out.println(smallest);
}
}
на ifPresent
метод Consumer<? super T>
в качестве параметра. Проще говоря, это должно быть действие без return
заявление. Вы можете распечатать значение, если оно присутствует, например
[...].ifPresent(System.out::print);
но это не то, что об идее говорит. Я думаю, вам просто нужно сохранить Option<Integer>
экземпляр, а затем проверьте его isPresent
:
Optional<Integer> o = list.stream().min(Integer::compareTo);
if (o.isPresent()) {
smallest = o.get();
}
конечно, есть более удобные способы с orElse
:
smallest = o.orElse(Integer.MIN_VALUE);
или с тернарным оператором:
smallest = o.isPresent() ? o.get() : Integer.MIN_VALUE;