2016-03-24 3 views
-4

используя java8 и поток api.Конвертировать карту <Long, MyObject> в Map <Long, List <MyObject>>

Существует только один MyObject, и я хочу, чтобы преобразовать

Map<Long, MyObject> 

в

Map<Long, List<MyObject>> 

где список имеет один элемент?

+0

Если у вас есть только один ключ, зачем использовать карту? А не набор? –

+0

@ ManuelS Одно значение, а не один ключ. – NimChimpsky

+0

Существует только один MyObject ... den, почему вы хотите использовать Список ?? –

ответ

4
Map<Long, List<MyObject>> newMap = oldMap.entrySet().stream() 
       .collect(Collectors.toMap(
          Entry::getKey, 
          e -> new ArrayList<>(Arrays.asList(e.getValue())))); 

Если неизменяемый список стоимости в порядке, последняя строка может быть немного упрощен:

      e -> Collections.nCopies(1, e.getValue()))); 
+1

Это выражение лямбда, возможно, немного верхнее для OP, поскольку он, кажется, новичок, но ответ все еще действительны и правильны. +1 –

+1

@RoelStrolenberg OP имеет золотой значок java, я не думаю, что он такой зеленый. –

+0

Я ничего не сказал –

1
Map<Long, MyObject> yourMap = whateverYouImplementedHere; 
Map<Long, List<MyObject>> listMap = new HashMap<>(); 

for (Entry<Long, MyObject> entry : yourMap.entrySet()){ 

    listMap.put(entry.getKey(), new ArrayList<MyObject>(Arrays.asList(entry.getValue())); 
} 
+0

Это решило бы общий вопрос OP, хотя другие структуры данных намного лучше –

+0

. Это не использует возможности java 8 stream. – NimChimpsky

1

Вы можете просто получить запись набора потока и использовать toMap коллектор в сочетании с Collections.singletonList (который создает неизменный список) для создания новых значений из исходной карты.

Map<Long, List<MyObject>> transformedMap = 
    map.entrySet() 
     .stream() 
     .collect(toMap(Map.Entry::getKey, 
         e -> Collections.singletonList(e.getValue())));