несоответствие типов не может быть преобразовано из целого числа в необязательное <Integer> - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь понять потоки прямо сейчас. Я хотел бы сохранить наибольшее число из потока в качестве необязательного, но программа позволяет мне сохранить его как целое число. Поскольку поток может быть пустым, поэтому значение не самое высокое, я хотел бы сохранить его как необязательный.

Я уже пробовал это сделать:

import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.Optional;
import java.util.stream.Stream;

public class StreamsTest {

    public static void main(String[] args) {

        Collection<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < 10; i++) {
            list.add(i);
        }
        Stream<Integer> stream1 = list.stream().filter(x -> x % 2 == 1);
        if (stream1.findAny().isPresent() == true)
            System.out.println("Hey");
        Optional<Integer> opt = stream1.max(Comparator.comparing(Integer::valueOf)).get();
    }

}

Это из-за .get ()? Я мог предположить, что когда я использую это, программа ожидает получить значение. Если он не получает значения, он уже падает на этом этапе, и нет необходимости пытаться сохранить его в переменной. Поэтому он либо получает значение и сохраняет его в переменной Integer, либо вылетает, поскольку .get () не может доставить ввод для необязательного.

1 Ответ

3 голосов
/ 30 апреля 2020

get возвращает само значение, разворачивает Optional, поэтому тип переменной должен быть Integer.

Integer opt = stream1.max(Comparator.comparing(Integer::valueOf)).get();

Обратите внимание, что get без isPresent небезопасно и может приведет к исключению.

Есть более хороший способ, хотя

int max = list.stream()
        .filter(x -> x % 2 == 1)
        .mapToInt(Integer::valueOf)
        .max()
        .orElse(0); // or other value

Эта проверка

if (stream1.findAny().isPresent() == true)
    System.out.println("Hey");

не является правильной, поскольку она всегда будет истинной (1 ) [судя по вашим данным] и использует операцию терминала в потоке (2) [то есть вы не сможете использовать ее позже, как пытались].

Весь метод можно переписать в

IntStream
        .range(0, 10)
        .filter(x -> x % 2 == 1)
        .max()
        .orElseThrow(() -> new IllegalArgumentException("no max"));

Обратите внимание, что здесь я использовал другую технику. Я собираюсь сгенерировать исключение, если максимум не может быть рассчитан (нет элементов в потоке).

...