我有这堂课:
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<>();
我希望找到Member
等于某个id。我尝试如下:
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;
答案 0 :(得分:6)
将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);
答案 1 :(得分:3)
您可以使用嵌套Stream的过滤器代替forEach。
最后你可以返回第一场比赛或收集所有比赛
...
.filter(structUser -> structUser.getMembers()
.stream()
.anyMatch(member -> member.getId().equals(id))
)
...