簡體   English   中英

Person 對象包含 EnumSet。 如何轉換列表<person>到 EnumMap <enumset.values, list<person.name> &gt; 使用聚合函數/lambdas</enumset.values,></person>

[英]Person objects contain EnumSet. How to convert List<Person> to EnumMap<EnumSet.values, List<Person.name>> using aggregate functions / lambdas

我正在嘗試在 Java 中學習聚合函數lambda 我有一個 class:

public class Person {
    public enum Privilege{
        PRIV1, PRIV2, PRIV3, PRIV4, PRIV4
    }
    private String name;
    private Set<Privilege> privileges;
...
}

以及這個 class 的對象列表。 我想將其轉換為EnumMap<Privilege, List<String>>其中 List 包含所有具有特定特權的人的姓名。 我創建了一個方法來做到這一點:

 public static Map<Privilege,List<String>> personsByPrivilege(List<Person> personList){
        Map<Privilege, List<String>> resultMap = new EnumMap(Privilege.class);
        Arrays.asList(Privilege.values())
                .stream()
                .forEach(p->resultMap.put(p,new ArrayList<String>()));
        for(Person p :personList){
            Set<Privilege> personsPrivileges = p.getPrivileges();
            for(Privilege pr : personsPrivileges){
                resultMap.get(pr).add(p.getName());
            }
        }
        return resultMap;
    }

我如何使用聚合函數來做到這一點? 我的意思是例如personlist.stream().collect風格

您可以將人員列表 -> 權限列表展平成對,然后按權限分組,然后按名稱分組 map

public static Map<Person.Privilege, List<String>> personsByPrivilegeB(List<Person> personList) {
    return personList.stream()
            .flatMap(pers -> pers.getPrivileges().stream().map(priv -> new Object[]{priv, pers.getName()}))
            .collect(groupingBy(o -> (Person.Privilege) o[0], mapping(e -> (String) e[0], toList())));
}

您可以添加一對 class 並使用以下代碼來實現您的目標

        return personList.stream().flatMap(p -> {
            String name = p.getName();
            return p.getPrivileges().stream()
                    .flatMap(priv -> Stream.of(new NamePriviledge(priv, name)));
        }).collect(Collectors.groupingBy(NamePriviledge::getPrivilege, Collectors.mapping(NamePriviledge::getName, Collectors.toList())));
    }

class NamePriviledge {
    private final Person.Privilege privilege;
    private final String name;

    public NamePriviledge(Person.Privilege privilege, String name) {
        this.privilege = privilege;
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public Person.Privilege getPrivilege() {
        return privilege;
    }

    @Override
    public String toString() {
        return "NamePriviledge{" +
                "privilege=" + privilege +
                ", name='" + name + '\'' +
                '}';
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM