All_Safe
All_Safe

Reputation: 1399

Update nested list of objects using java stream api

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

Answers (1)

Calculator
Calculator

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

Related Questions