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;