如何用Java中的流通过另一个列表过滤列表?

问题描述 投票:0回答:1

我在玩耍,试图学习过滤器。我自己进行一些调查,并尝试通过一个列表,另一个列表,数组列表进行筛选以获取某些数据。我想查看对象是否包含user

我知道userProjectRoles是一个ArrayList,然后得到Project Object,然后是成员(Project.Members)。但是,如何遍历所有arrayList,然后转到Roles.Name以查看那里的数据呢?

这里是我的东西,被卡住了一段时间。

任何帮助都是有益的。非常感谢!

UserProjectRole userProjectRole = userProjectRoles.stream().filter(test ->
                test.getProject().getMembers()).

description of what i am trying to get too

java java-8
1个回答
0
投票

让我先尝试使用for循环方法,以便您可以轻松地使用流重写逻辑:

首先,您拥有所有的[[POJO

public class Project { List<User> members; public List<User> getMembers() { return members; } public void setMembers(List<User> members) { this.members = members; } }
public class User {

    List<Project> projects;
    Set<Role> roles;

    public List<Project> getProjects() {
        return projects;
    }

    public void setProjects(List<Project> projects) {
        this.projects = projects;
    }

    public Set<Role> getRoles() {
        return roles;
    }

    public void setRoles(Set<Role> roles) {
        this.roles = roles;
    }
}
public class Role {

    String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

public class TestDrive {

    public static void main(String[] args) {
        //all current projects in my company
        Project backend = new Project();
        Project frontend = new Project();
        Project testing = new Project();

        //all members
        User scrumMaster = new User();
        User seniorEngineer = new User();
        User backendEngineer = new User();
        User frontEngineer = new User();
        User qaEngineer = new User();

        // various available roles
        Role admin = new Role();
        admin.setName("admin");
        Role lead = new Role();
        lead.setName("lead");
        Role mainEngineer = new Role();
        mainEngineer.setName("engineer-a");
        Role backupEngineer = new Role();
        backupEngineer.setName("engineer-b");

        // designation of above roles to current employees
        scrumMaster.setRoles(ImmutableSet.of(admin));
        seniorEngineer.setRoles(ImmutableSet.of(lead));
        backendEngineer.setRoles(ImmutableSet.of(mainEngineer, backupEngineer));
        frontEngineer.setRoles(ImmutableSet.of(mainEngineer, backupEngineer));
        qaEngineer.setRoles(ImmutableSet.of(mainEngineer));

        //assigning members to projects
        backend.setMembers(ImmutableList.of(scrumMaster, seniorEngineer, backendEngineer));
        frontend.setMembers(ImmutableList.of(scrumMaster, seniorEngineer, frontEngineer, qaEngineer));
        testing.setMembers(ImmutableList.of(scrumMaster, qaEngineer));

        //from perspective of one member
        backendEngineer.setProjects(ImmutableList.of(backend));
        List<String> backendEngineerPeers = new ArrayList<>();
        for(Project project : backendEngineer.getProjects()){
            if (project.getMembers().size() > 0){
                for (User member: project.getMembers()){
                    if(member.getRoles().size() > 0){
                        for(Role aRole: member.getRoles()){
                            backendEngineerPeers.add(aRole.getName());
                        }
                    }
                }
            }
        }
        System.out.println(backendEngineerPeers);
    }
}

有信息流

List<String> backendEngineerPeersWithStream = backendEngineer.getProjects().stream() .flatMap(project -> project.getMembers().stream()) .flatMap(member -> member.getRoles().stream()) .map(role -> role.getName()) .collect(Collectors.toList()); System.out.println(backendEngineerPeersWithStream);

类图:enter image description here
© www.soinside.com 2019 - 2024. All rights reserved.