Java — Поиск в списке с помощью .stream

#java #java-stream

Вопрос:

Я пытаюсь использовать оператор .stream для поиска объекта в списке<>, но получаю синтаксическую ошибку, которую я не могу устранить, несмотря на то, что следую примерам, которые я нахожу в сети…надеюсь, кто-нибудь сможет помочь с тем, что я не понимаю.

Я настроил следующее в качестве объекта, который будет храниться в списке<>:

 import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
public class JelCodeMapping {
    private String jelCodeId;
    private String jelCodeName;
    private int network1;
    private int network2;
    private int network3;
}
 

Затем создайте экземпляр списка (он заполняется в другом месте).

 private List<JelCodeMapping> jelCodeMappings;
 

Затем я хочу найти объект в списке, содержащий определенное значение:

     private List<Integer> getNetworksForJelCode(String jelCode) {
        JelCodeMapping jelCodeMaping = jelCodeMappings.stream().filter(mapping -> mapping.getJelCodeId().equals(jelCode));

        List<Integer> jelCodeNetworks = new ArrayList<>();

//  other stuff happens here

        return jelCodeNetworks;
    }
 

но строка, в которой я использую оператор .stream (), генерирует следующее сообщение об ошибке синтаксиса:

 Incompatible Types
Required: <packagePath>.JelCodeMapping
Found: java.util.stream.Stream   <packagePath>.jelCodeMapping
 

Я совершенно уверен, что следую найденным примерам, но не могу решить проблему. Чего я не понимаю?

Спасибо за любые мысли/идеи

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

1. Как вы думаете, какой тип filter() возвращается?

Ответ №1:

Вы должны добавить в поток терминальную операцию.

Например

 JelCodeMapping jelCodeMaping = jelCodeMappings.stream()
    .filter(mapping -> mapping.getJelCodeId().equals(jelCode))
    .findFirst()
    .orElseThrow(() -> new RuntimeException(
        "JelCodeMapping not found: "   jelCode));
 

Смотрите также документацию для потоков и, в частности, filter, findFirst или findAny.

Ошибка «Несовместимые типы» связана с тем, что filter(Predicate) возвращает a Stream . Значение Stream не может быть присвоено JelCodeMapping переменной.

Методы поиска возвращают необязательное значение, и orElseThrow методы либо вернут необязательное значение, если оно присутствует, либо создадут исключение.

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

1. Отлично, спасибо, Уильям…очень полезно!

Ответ №2:

Ответ Уильяма по существу.

С Java 9 и выше вы также можете использовать dropWhile и findFirst (это эквивалентная альтернатива).

 jelCodeMappingList.stream().dropWhile(jelCodeMapping -> !jelCodeMapping.equals("ID")).findFirst()
 

Если в списке может быть несколько элементов с одинаковым идентификатором, вы можете использовать

 jelCodeMappingList.stream().collect(Collectors.filtering(jelCodeMapping -> jelCodeMapping.getJelCodeId().equals("ID"),Collectors.toList()));
 

который возвращает вам список JelCodeMapping с тем же идентификатором.

Ответ №3:

Может быть , вам нужно collect() , и убедитесь, что есть кто-то, кто jelCodeId равен с jelCode в jelCodeMappings ;

 List<JelCodeMapping> jelCodeMaping =
                jelCodeMappings.stream()
                    .filter(mapping -> mapping.getJelCodeId().equals(jelCode))
                    .collect(Collectors.toList());