0

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));
    }
6
  • What is userTypes and the type SmbpUserType? What does that have to do with StructUserType? Do you have any code attempts at a streams solution, or any thoughts about how you might code it? Commented Feb 23, 2018 at 18:54
  • Can you update your question to provide a general overview of level of nesting that you are talking about? In the question I can see a list List<Member> and that's about it. Commented Feb 23, 2018 at 19:26
  • @Raf, I have List<UserType>, UserType contains List<Member>. I want update member by Id of this member, for example, set new name field. I updated my question, how can I made this. But I think, my method not optimal. Commented Feb 23, 2018 at 19:30
  • Much better. What is the result you are getting when you run this? Does it not update? Or you are getting an exception or some other result? Commented Feb 23, 2018 at 19:39
  • @Raf, It's work perfect, it update. But, I think this is not the optimal solution, because In fact, the same filter works twice in the first method, and then in the second. Commented Feb 23, 2018 at 19:44

1 Answer 1

1

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);
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.