java 列转行

2020-11-13  本文已影响0人  朝闻道夕睡觉

一个员工在多个部门内,一个部门有多个员工
List<员工> -----------> Map<部门id,List<员工>>

1.部门类

public class Dept {
    public Dept(String id) {
        this.id = id;
    }
    private String id;
    //省略get,set 方法
}

2.员工类

public class User {
    public User(String id) {
        this.id = id;
    }
    private String id;
    private List<Dept> deptList;
    //省略get,set 方法
}

3: 测试类

public class TestDemo {

    public static void main(String[] args) {
        User user1 = new User("员工1");
        User user2 = new User("员工2");
        User user3 = new User("员工3");
        Dept dept1 = new Dept("部门1");
        Dept dept2 = new Dept("部门2");

        ArrayList<Dept> deptList = new ArrayList<>();
        deptList.add(dept2);
        deptList.add(dept1);
        // 员工1 = 部门1,2
        user1.setDeptList(deptList);
        // 员工2 = 部门1
        user2.setDeptList(Collections.singletonList(dept1));
        // 员工3 = 部门1,2
        user3.setDeptList(deptList);

        ArrayList<User> userList = new ArrayList<>();
        userList.add(user3);
        userList.add(user2);
        userList.add(user1);
        /* 转换成部门map应该为
         *  部门1 = 员工1,2,3
         *  部门2 = 员工1,3
         */
        
    }
}

4.1我的实现:

先建一个组合类

public class UserComposite {
    public UserComposite(User user, String deptId) {
        this.user = user;
        this.deptId = deptId;
    }
    private User user;
    private String deptId;
    //省略 get,set 方法
}

4.2: 实现代码

Map<String, List<User>> map = userList.stream()
                // 过滤空部门的数据
                .filter(user -> user.getDeptList() != null && !user.getDeptList().isEmpty())
                // 转换部门和员工的关系
                .map(user-> user.getDeptList().stream().map(dept-> new UserComposite(user, dept.getId())).collect(Collectors.toList()))
                // 合并流进行分组
                .flatMap(List::stream).collect(Collectors.groupingBy(UserComposite::getDeptId, Collectors.mapping(UserComposite::getUser, Collectors.toList())));

        System.out.println(map);
上一篇 下一篇

猜你喜欢

热点阅读