【问题标题】:Java Stream API: how to convert to a Map of SetsJava Stream API:如何转换为集合映射
【发布时间】:2018-10-25 17:54:35
【问题描述】:

假设我有一个名为 Employee 的类和这些 Employee-classes 的列表:

class Employee {

private String praefix;
private String middleFix;
private String postfix;
private String name;

public Employee(String praefix, String middleFix, String postfix, String name) {
    this.praefix = praefix;
    this.middleFix = middleFix;
    this.postfix = postfix;
    this.name = name;
}

public String getPraefix() {
    return praefix;
}

public void setPraefix(String praefix) {
    this.praefix = praefix;
}

public String getMiddleFix() {
    return middleFix;
}

public void setMiddleFix(String middleFix) {
    this.middleFix = middleFix;
}

public String getPostfix() {
    return postfix;
}

public void setPostfix(String postfix) {
    this.postfix = postfix;
}

public String getName() {
    return name;
}

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



List<Employee> employees = new ArrayList<>();
employees.add(new Employee("A", "B", "C", "Michael Phelps"));
employees.add(new Employee("A", "B", "C", "Cristiano Ronaldo"));
employees.add(new Employee("D", "E", "F", "Usain Bolton"));
employees.add(new Employee("D", "E", "F", "Diego Armando Maradona"));
employees.add(new Employee("D", "E", "F", "Lionel Messi"));

是否可以使用 Java Stream-API 将其转换为跟随地图?

{A.B.C=[Cristiano Ronaldo, Michael Phelps], D.E.F=[Aydin Korkmaz, Diego Armando Maradona, Usain Bolton]} 

【问题讨论】:

    标签: java arraylist hashmap java-stream


    【解决方案1】:

    您也可以使用toMap 收集器:

    Map<String, List<String>> resultSet = employees.stream()
                 .collect(toMap(e ->
                   String.join(".", e.getPraefix(), e.getMiddleFix(), e.getPostfix()),
                   v -> new ArrayList<>(Collections.singletonList(v.getName())),
                   (left, right) -> {left.addAll(right); return left;}));
    

    【讨论】:

    • 这正是我今天想要在默认 jdk 中拥有的,ArrayList.of(...)HashSet.of(...),会让这更好一点
    • @Eugene 完全同意,目前的方法肯定是冗长的。
    【解决方案2】:
      Map<String, List<String>> result = employees.stream()
                .collect(Collectors.groupingBy(
                        x -> String.join(".",
                                x.getPraefix(),
                                x.getMiddleFix(),
                                x.getPostfix()),
                        Collectors.mapping(Employee::getName, Collectors.toList())
    

    【讨论】:

    • Stream.of(x.getPraefix(), x.getMiddleFix(), x.getPostfix()) .collect(Collectors.joining(".") 可以使用 + 替换为简单的串联
    • @Ivan 哦,天哪! thx,当我尝试一次做两件事时会发生这种情况。
    • 省略了“。”分隔符虽然。我认为第一个更好。
    • @Vasan 两者都不是 :) 第三个选项怎么样(我实际上会自己使用)
    • 啊,是的,我忘记了 StringJoiner。 +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多