Я пытаюсь воспроизвести следующее поведение с помощью потоков:
public List<ObjDTO> getList(param1){
List<SomeObj> allObjs = getAll(param1);
List<ObjDTO> finalList = new ArrayList<>();
for (SomeObj someObj : allObjs){
SomeEnum someEnum = methodcall(someObj, param1);
if (!SomeEnum.VALUE.equals(someEnum)){
finalList.add(new ObjDTO(someObj, someEnum.getMessage()));
}
}
return finalList;
}
Что у меня есть до сих пор:
public List<ObjDTO> getList(param1){
List<SomeObj> allObjs = getAll(param1);
return allObjs.stream()
.filter(someObj -> !SomeEnum.VALUE.equals(methodcall(someObj, param1)))
.map(someObj -> new ObjDTO(someObj, someEnum.getMessage()))
.collect(Collectors.toList());
}
Проблема здесь в том, что у меня больше нет этого someEnum
, поэтому мне нужно как-то создать переменную в filter()
и использовать ее внутри map()
.
Есть ли способ сделать это или кто-нибудь найдет лучший подход?
Вы можете сделать это с помощью flatMap
:
return allObjs.stream()
.flatMap(someObj ->
Stream.of(methodcall(someObj, param1))
.filter(someEnum -> !SomeEnum.VALUE.equals(someEnum))
.map(someEnum -> Stream.of(new ObjDTO(someObj, someEnum.getMessage()))))
.collect(toList());
эта строка вызывала это:
Я попробовал этот подход, и теперь я получаю сообщение об ошибке, потому что метод должен был возвращать список <ObjDTO>, а вместо этого возвращал список <Stream<ObjDTO>>. Знаете ли вы решение этой проблемы?