2017-07-20 24 views
10

Tôi có lớp sau:Làm thế nào để chuyển đổi thiết lập bản đồ với một tập hợp làm giá trị trong java 8?

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

Tôi nhận được một bộ A và muốn chuyển nó sang một bản đồ nơi quan trọng là hệ thống id, và giá trị được đặt của A. (Map<String, Set<A>) Có thể có nhiều phiên bản A với cùng một hệ thống.

dường như không thể tìm ra cách để làm điều đó .. đã đến đây nhưng bản sắc rõ ràng là không đúng

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

bạn có thể xin vui lòng giúp đỡ?

+1

xem tại đây, điều này có thể giúp bạn https://stackoverflow.com/questions/16108734/convert-setmap-entryk-v-to-hashmapk-v –

Trả lời

7

Bạn có thể sử dụng groupingBy thay vì toMap:

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

Cảm ơn nhiều! – user1386966

+1

@Thilo Đúng vậy. Tôi chỉ đưa ánh xạ vào một Set vì đó là đầu ra mong muốn trong câu hỏi. – Eran

2

tôi 2 ¢: bạn thể làm điều đó với Collectors.toMap nhưng nó hơi dài dòng hơn:

 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

Đầu tiên, bỏ phiếu. '0.02 $' có nghĩa là gì? Tôi đã thấy bạn nói nó nhiều lần. –

+2

@ holi-java https://en.wikipedia.org/wiki/My_two_cents nó có nghĩa là đây là một bổ sung rất nhỏ với những gì đã được nói – Eugene

+1

Và vì lý do gì, mọi người thích viết '0,02 $ 'thay thế của '2 ¢' và đôi khi, chúng thậm chí còn bỏ qua “my” trước đó… – Holger

2

Như con suối không được yêu cầu cụ thể , đây là cách để làm điều đó chỉ với API Map:

Map<String, Set<A>> map = new HashMap<>(); 
mySet.forEach(a -> map.computeIfAbsent(a.getSystemId(), k -> new HashSet<>()).add(a)); 
Các vấn đề liên quan