繁体   English   中英

从流中获取父对象

[英]Get parent object from stream

我有这门课:

public class StructUserType extends UserType {

    MembersList membersList = new MembersList();

    public List<Member> getMembers() {
        return Collections.unmodifiableList(membersList.members);
    }

    static class MembersList {
        List<Member> members = new ArrayList<>();
    }

    public static class Member implements Identifiable {
        private Integer id;

        public Integer getId() {
            return id;
        }
    }    
} 

我有一个List对象:

List<SmbpUserType> userTypes = new ArrayList<>();

我想找到一个等于某个id的Member 我尝试如下:

Integer id = 1;
userTypes.stream()
                .filter(StructUserType.class::isInstance)
                .map(StructUserType.class::cast)
                .forEach(structUserType -> {
                    structUserType.getMembers()
                            .stream()
                            .filter(m -> m.getId() == id)
                            .findFirst().orElse(null);
                });

我想,当内部流中的过滤器运行并找到第一个成员时,返回该成员包含的父元素,即那些UserType

模拟经典风格:

for (UserType userType : userTypes) {
            if (userType instanceof StructUserType) {
                List<StructUserType.Member> members = ((StructUserType) userType).getMembers();

                for (StructUserType.Member member : members) {
                    if (member.getId() == id) {
                        return userType;
                    }
                }
            }
        }
        return null;

forEach替换为filter ,以查找满足内部流管道条件的StructUserType实例。 然后获取Stream的第一个元素,如果存在的话。

return
   userTypes.stream()
            .filter(StructUserType.class::isInstance)
            .map(StructUserType.class::cast)
            .filter(st -> st.getMembers()
                            .stream()
                            .anyMatch(m -> m.getId().equals(id)))
            .findFirst()
            .orElse(null);

您可以使用过滤器来嵌套Stream,而不是forEach。

最后你可以返回第一场比赛或收集所有比赛

...
.filter(structUser -> structUser.getMembers()
                      .stream()
                      .anyMatch(member -> member.getId().equals(id))
       )
...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM