如何将set转换为map,并将set设置为java 8中的值?

时间:2017-07-20 07:12:05

标签: java java-8 java-stream

我有以下课程:

class A {
   private String id;
   private String name;
   private String systemid;
}

我正在获取一组A,并希望将其转换为密钥为系统ID的映射,并将值设置为A.(Map<String, Set<A>) 可以有多个具有相同systemid的A实例。

似乎无法弄明白该怎么做.. 到了这里,但身份显然不对

Map<String, Set<A>> sysUidToAMap = mySet.stream().collect(Collectors.toMap(A::getSystemID, Function.identity()));
你能帮忙吗?

3 个答案:

答案 0 :(得分:8)

您可以使用groupingBy代替toMap

Map<String, Set<A>> sysUidToAMap =  
    mySet.stream()
         .collect(Collectors.groupingBy(A::getSystemID,
                                        Collectors.toSet()));

答案 1 :(得分:2)

我的2¢:你可以Collectors.toMap来做,但它稍微冗长一点:

      yourSet
      .stream()
            .collect(Collectors.toMap(
                    A::getSystemId,
                    a -> {
                        Set<A> set = new HashSet<>();
                        set.add(a);
                        return set;
                    }, (left, right) -> {
                        left.addAll(right);
                        return left;
                    }));

答案 2 :(得分:2)

由于没有特别要求流,只有使用Map API才能实现这一点:

Map<String, Set<A>> map = new HashMap<>();
mySet.forEach(a -> map.computeIfAbsent(a.getSystemId(), k -> new HashSet<>()).add(a));