2016-03-24 13 views
-4

java8 ve stream api kullanarak eşleştirin.Harita <Long, MyObject> öğesini <1, >

Sadece bir MyObject olduğunu ve

Map<Long, MyObject> 

liste bir eleman vardır
Map<Long, List<MyObject>> 

dönüştürmek istediğiniz?

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

Yalnızca bir anahtarınız olacaksa, neden haritayı kullanın? Ve bunun yerine bir set değil mi? –

+0

@ManuelS Tek bir değer, bir anahtar değil. – NimChimpsky

+0

Sadece bir tane MyObject var ... den neden List 'u kullanmak istiyorsunuz? –

cevap

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

, son satır biraz basitleştirilmiş olabilir Orijinal haritadan yeni değerler oluşturmak için (değişmez bir liste oluşturur).

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

Bu lambda ifadesi, yeni başlayanlar için olduğu gibi OP için en üstte olabilir. hala geçerli ve doğru. +1 –

+1

@RoelStrolenberg OP'in altın bir java rozeti var, o kadar yeşil olduğunu sanmıyorum. –

+0

Hiçbir şey demedim –

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

Bu, OP'nin genel sorusunu çözebilir, ancak diğer veri yapıları çok daha iyi –

+0

ise bu java 8 akışı özelliklerinden hiçbirini kullanmaz – NimChimpsky

1

sadece giriş seti akışı almak ve Collections.singletonList ile kombine toMap kollektörü kullanabilirsiniz: değerindeki değişmez liste tamam ise