stream之flatMap實踐

1.權限分配案例

需求:

公司的管理系統定義了若干個角色

公司的每個部門領導對每個角色分配自己部門的若干權限

 

現在需要綜合每個角色的所有權限

@Data
    @AllArgsConstructor
    @NoArgsConstructor
    static class KeyPair {
        private String key;
        private String value;
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    static class RoleRight {
        private List<String> roles;
        private List<String> rights;
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    static class RoleRightResult {
        private String role;
        private List<String> rights;
    }

 

2.分解,綜合權限

 List<RoleRight> list = Arrays.asList(
                new RoleRight(Arrays.asList("role1", "role2"), Arrays.asList("right1", "right2")),
                new RoleRight(Arrays.asList("role1", "role2", "role3"), Arrays.asList("right4", "right5", "right6")),
                new RoleRight(Arrays.asList("role3", "role2"), Arrays.asList("right7", "right8")));


List<RoleRightResult> listResult2 = list.stream()
                .flatMap(p -> p.roles.stream().flatMap(q -> p.rights.stream().map(k -> new KeyPair(q, k))))
                .collect(Collectors.groupingBy(t -> t.key))
                .entrySet()
                .stream()
                .map(p -> new RoleRightResult(p.getKey(),
                        p.getValue().stream().map(q -> q.value).collect(Collectors.toList())))
                .collect(Collectors.toList());

 

3.結果

[StreamTest.RoleRightResult(role=role1, rights=[right1, right2, right4, right5, right6]), StreamTest.RoleRightResult(role=role2, rights=[right1, right2, right4, right5, right6, right7, right8]), StreamTest.RoleRightResult(role=role3, rights=[right4, right5, right6, right7, right8])]

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章