Как собрать в карту, формируя список по значению при дублировании ключей в потоках, в Java 8 - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть поток элементов в виде 2-D массива или 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->e[0] и e->e[1], чтобы решить проблему. Это возможно? Для этого мне нужен доступ к текущему объекту карты, который собирается. Я не уверен, имеет ли это смысл.
  2. Способ достижения этого с помощью потоков Java 8.

Ожидаемый результат:

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

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Вы можете использовать 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;}));
0 голосов
/ 03 сентября 2018

Вот для чего 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]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...