【问题标题】:How to collect into a Map forming a List in value when duplicate keys in streams, in Java 8在 Java 8 中,当流中的键重复时,如何收集到 Map 中形成值列表
【发布时间】:2019-02-08 02:50:23
【问题描述】:

我有一个二维数组或EntrySet 形式的元素流。我需要将这些收集到Map。现在的问题是元素流可以有重复的元素。假设我希望值是一个列表:

Map<String,List<String>>

示例:

class MapUtils
{
// Function to get Stream of String[]
private static Stream<String[]> getMapStream()
{
    return Stream.of(new String[][] {
            {"CAR", "Audi"},
            {"BIKE", "Harley Davidson"},
            {"BIKE", "Pulsar"}
    });
}

// Program to convert Stream to Map in Java 8
public static void main(String args[])
{
    // get stream of String[]
    Stream<String[]> stream = getMapStream();

    // construct a new map from the stream
    Map<String, String> vehicle =
            stream.collect(Collectors.toMap(e -> e[0], e -> e[1]));

    System.out.println(vehicle);
}
}

输出:

java.lang.IllegalStateException: Duplicate key Harley Davidson

我想有个办法

  1. 我可以操作e-&gt;e[0]e-&gt;e[1] 来解决问题。那可能吗?为此,我需要访问正在收集的当前地图对象。我不确定这是否有意义。
  2. 一种可以使用 Java 8 流实现此目的的方法。

预期输出:

{CAR=[Audi], BIKE=[Harley Davidson, Pulsar]}

【问题讨论】:

    标签: java java-8 hashmap java-stream


    【解决方案1】:

    这就是groupingBy 的用途:

    Map<String,List<String>> vehicle = 
        stream.collect(Collectors.groupingBy(e -> e[0], 
                       Collectors.mapping(e -> e[1],
                                          Collectors.toList())));
    

    输出图:

    {CAR=[Audi], BIKE=[Harley Davidson, Pulsar]}
    

    【讨论】:

      【解决方案2】:

      你可以使用groupingBy

      getMapStream()
            .map(item -> Arrays.asList(item))
            .collect(Collectors.groupingBy(l->l.get(0),
                 Collectors.mapping(l1->l1.get(1),Collectors.toList())));
      

      或将toMap() 与合并功能一起使用。

           Map<String,List<String>> vehicle = getMapStream()
                  .collect(Collectors.toMap(item->item[0],
             item->new ArrayList<>(Arrays.asList(item[1])),
                                  (l1,l2)->{l1.addAll(l2);return l1;}));
      

      【讨论】:

      • 所以在toMap中,我们传递的第三个参数是merge函数。正确的?方法也不错:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-21
      • 1970-01-01
      相关资源
      最近更新 更多