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