在 java 流中,是否可以使用您将在地图范围内的过滤器子句上获得的变量?
In java streams is it possible to use the variable that you will get on a filter clause inside the scope of a map?
我正在尝试借助流重现以下行为:
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());
我正在尝试借助流重现以下行为:
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());