Получение исключения NoSuchElementException при выполнении filter findFirst

#filter #java-8 #nosuchelementexception #findfirst

#Фильтр #java-8 #исключение nosuchelementexception #findfirst

Вопрос:

Я продолжаю получать «java.util.NoSuchElementException: значение отсутствует» при выполнении filter findFirst. Я не могу сильно изменить код, так как это нарушит другую часть кода, и мы не хотим писать логику метода внутри filter. Приведенный ниже код.

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

Ошибка :

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

Ошибка заключается в том, что значение равно null для » .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) выдает null, потому что stream отсутствует.
Отсюда и исключение.

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

Комментарии:

1. Optional Возвращаемое .findFirst() значение может быть пустым. Это означает, что совпадение не найдено. Это может произойти, когда source.getTrans() возвращает пустую коллекцию или null (при явном сопоставлении null с пустым набором), или если filter предикаты ничего не приняли. Имейте в виду, что ваш поток принимает только элементы, для которых .getDType() == null и .getD() != null . Как правило, вы не должны вызывать get() для Optional , не проверив, присутствует ли значение. Когда это так, ваши последующие тесты (помимо смешивания trans переменной и EmployeeTransaction типа) являются избыточными

2. Да, но в этом случае source.getTrans() имеет значение

3. У вас есть класс и переменная, вызываемые одновременно EmployeeTransaction ?

4. вы можете использовать этот пример,

5. Вы запрашиваете альтернативу get() вызову, потому что он выдает исключение? Почему нет orElse(...) ?

Ответ №1:

Это выведет 10, как и ожидалось, или «Null», если список пуст:

 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 и посмотреть на результат.

Комментарии:

1. Спасибо, но в случаях, когда список пуст, это приведет к сбою.

2. @Rahul Я добавил несколько возможных способов обработки пустых списков.

3. Спасибо, но мне пришлось вызвать ниже в случае NULL .. map( t -> { System.out.println(«Null»); возвращает 0;