在java流中,是否可以使用在映射范围内的过滤器子句上获得的变量?

问题描述 投票:0回答:1

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

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()
中使用它。 有没有办法做到这一点或者有人找到更好的方法?

java lambda java-stream
1个回答
1
投票

你可以用

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());
© www.soinside.com 2019 - 2024. All rights reserved.