在Java 8中,当流中的重复键时,如何收集形成List的值

Nil*_*pal 8 java hashmap java-8 java-stream

我有一个二维数组或元素形式的元素流EntrySet.我需要将它们收集起来Map.现在的问题是元素流可以有重复的元素.假设我希望该值为列表:

Map<String,List<String>>
Run Code Online (Sandbox Code Playgroud)

示例:

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);
}
}
Run Code Online (Sandbox Code Playgroud)

输出:

java.lang.IllegalStateException: Duplicate key Harley Davidson
Run Code Online (Sandbox Code Playgroud)

我想有办法

  1. 我可以操作e->e[0]e->e[1]解决问题.那可能吗?为此,我需要访问正在收集的当前地图对象.我不确定这是否合理.
  2. 使用Java 8流可以实现这一点的方法.

预期产出:

{CAR=[Audi], BIKE=[Harley Davidson, Pulsar]}
Run Code Online (Sandbox Code Playgroud)

Era*_*ran 7

groupingBy是为了:

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

输出图:

{CAR=[Audi], BIKE=[Harley Davidson, Pulsar]}
Run Code Online (Sandbox Code Playgroud)


Had*_*i J 7

您可以使用groupingBy

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

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;}));
Run Code Online (Sandbox Code Playgroud)