Получение NoSuchElementException при выполнении фильтра findFirst - PullRequest
0 голосов
/ 04 апреля 2019

Я продолжаю получать 'java.util.NoSuchElementException: значение отсутствует' при выполнении фильтра findFirst. Я не могу сильно изменить код, так как он сломает другую часть кода, и мы не хотим писать логику метода внутри фильтра. Код дайте ниже.

--- Я получаю ошибку ниже при вызове метода

Ошибка:

java.util.NoSuchElementException: No value present
        at java.util.Optional.get(Optional.java:135)

Ошибка в том, что значение равно нулю для ".filter (x -> x> 5) .findFirst () "

public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 10, 3, 7, 5);
        int a = list.stream()
                   // .peek(num -> System.out.println("will filter " + num))
                .filter(x -> x== null)
                .map( t -> {
                    System.out.println("hello");
                    return 0;
                })
                    .filter(x -> x > 5)
                    .findFirst()
                    .get();
        System.out.println(a);

Здесь list.stream () выдаст поток, который будет использоваться .filter (x -> x == null). Теперь в этом сценарии x не является нулевым, поэтому, когда дело доходит до .filter (x -> x> 5), он дает нулевое значение, потому что потока там нет. Отсюда и исключение.

Мне нужна помощь в какой-то альтернативе для этого.

1 Ответ

0 голосов
/ 04 апреля 2019

Будет выведено 10, как ожидается, или «Ноль», если список пуст:

List<Integer> list = Arrays.asList(1, 10, 3, 7, 5);
Optional<Integer> a = list.stream()
        .filter(x -> x > 5)
        .findFirst();
System.out.println(a.isPresent() ? a.get() : "Null");

Вы не хотите использовать здесь метод map, который используется для применения операции ккаждый элемент и замените его результатом.Например, .map(x -> x + 3) изменит [1, 10, 3, 7, 5] на [4, 13, 6, 10, 8].Вы не можете сказать, является ли поток пустым или нет от промежуточной операции, такой как map, вам нужно использовать терминальную операцию, такую ​​как findFirst, и посмотреть на результат.

...