2017-07-20 56 views
10

Aşağıdaki sınıf var: (Map<String, Set<A>)Bir kümeyle java 8'deki değer olarak nasıl ayarlanır?

class A { 
    private String id; 
    private String name; 
    private String systemid; 
} 

Ben A kümesi alma ve anahtar sistemi kimliği olan bir haritaya dönüştürmek istiyor ve değer A'nın ayarlanır ediyorum Aynı sistemid ile birden çok A örneği olabilir.

buralara var ama kimlik

Map<String, Set<A>> sysUidToAMap = mySet.stream().collect(Collectors.toMap(A::getSystemID, Function.identity())); 

sen yardımcı misiniz açıkça doğru değil .. bunu nasıl anlamaya görünüyor değil mi?

+1

burada görebilirsiniz, bu size yardımcı olabilir https://stackoverflow.com/questions/16108734/convert-setmap-entryk-v-to-hashmapk-v –

cevap

7

Sen groupingBy yerine toMap kullanabilirsiniz:

Map<String, Set<A>> sysUidToAMap = 
    mySet.stream() 
     .collect(Collectors.groupingBy(A::getSystemID, 
             Collectors.toSet())); 
2

benim 2 ¢: Eğer Collectors.toMap ile bunu ama biraz daha ayrıntılı var olabilir:

 yourSet 
     .stream() 
      .collect(Collectors.toMap(
        A::getSystemId, 
        a -> { 
         Set<A> set = new HashSet<>(); 
         set.add(a); 
         return set; 
        }, (left, right) -> { 
         left.addAll(right); 
         return left; 
        })); 
+0

İlk önce, oylama. 0,02 $ 'ne demek? Birkaç kez söylediğini gördüm. –

+2

@ holi-java https://en.wikipedia.org/wiki/My_two_cents, bunun zaten söylenmiş olana çok küçük bir ekleme olduğu anlamına gelir – Eugene

+1

Ve nedense, insanlar bunun yerine 0.02 $ 'yazmak ister "2" nin ve bazen de "benim" ini bile çıkardılar… – Holger

2

akışları özellikle istenmedin gibi işte burada sadece Map API'sini gerçekleştirmek için bir yol var:

Map<String, Set<A>> map = new HashMap<>(); 
mySet.forEach(a -> map.computeIfAbsent(a.getSystemId(), k -> new HashSet<>()).add(a));