在java流中,是否可以使用映射范围内的filter子句中的变量



我正试图在流的帮助下重现以下行为:

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

最新更新