#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());