Reputation: 1399
I have this class:
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;
private String name;
//getters and setters
}
}
And I have a List
of object:
List<UserType> userTypes = new ArrayList<>();
I want update Member
object which is equal to a certain id. For example, update the name
field of member by id. How I can update nested list using stream
api?
UPDATE:
I did this:
In class StructUserType
I created one method:
void updateMember(Member member) {
membersList.members.stream()
.filter(m -> m.getId().equals(member.getId()))
.findFirst()
.ifPresent(m -> {
m.setName(member.getName());
m.setUserTypeId(member.getUserTypeId());
});
}
Also for external clients created a public method:
public void updateMemberOfStructUserType(StructUserType.Member member) {
userTypes.stream()
.filter(StructUserType.class::isInstance)
.map(StructUserType.class::cast)
.filter(st -> st.getMembers()
.stream()
.anyMatch(m -> m.getId().equals(member.getId())))
.findFirst()
.ifPresent(structUserType -> structUserType.updateMember(member));
}
Upvotes: 0
Views: 2299
Reputation: 2789
You can flatmap the userTypes
in the public update method and pass a stream of members to a common private updateMember
method:
private void updateMember(Member member, Stream<Member> membersStream){
membersStream.filter(m -> m.getId().equals(member.getId()))
.findFirst()
.ifPresent(m -> {
m.setName(member.getName());
m.setUserTypeId(member.getUserTypeId());
});
}
void updateMember(Member member) {
updateMember(member, membersList.members.stream());
}
public void updateMemberOfStructUserType(StructUserType.Member member) {
Stream<Member> membersStream = userTypes.stream()
.filter(StructUserType.class::isInstance)
.map(StructUserType.class::cast)
.flatMap(st -> st.getMembers().stream());
updateMember(member, membersStream);
}
Upvotes: 1