it-swarm.com.ru

Java 8 потоков "ifPresent"

Я пытаюсь узнать о потоках и столкнулся с проблемой: Я хочу получить минимальное значение списка и присвоить его переменной int . Для этого я сделал следующее:

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. Мой вопрос, наконец, таков: как я могу присвоить значение min переменной int smallest С проверкой ifPresent?

8
Stefan B

Stream#min возвращает Optional результата, потому что в общем случае поток может быть пустым, поэтому не может быть минимального значения.

 Optional<Integer> minimal = list.stream().min(Integer::compareTo);

Чтобы получить значение из Optional, вам нужно иметь некоторое запасное значение

Integer absent = Integer.MIN_VALUE;

Проще всего было бы использовать orElse

Integer smallest = minimal.orElse(absent);

Чуть дольше будет isPresent

Integer smallest = minimal.isPresent() ? minimal.get() : absent;
6
Nazarii Bardiuk

Вот как я это сделаю:

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);
    }
}
7
duffymo

Метод ifPresent принимает Consumer<? super T> в качестве параметра. Проще говоря, это должно быть действие без оператора return. Вы можете напечатать значение, если оно присутствует, например,

[...].ifPresent(System.out::print);

Но это не то, что говорит IDEA. Я думаю, вам просто нужно сохранить экземпляр 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;
1
Andrew Tobilko