2014-11-10 33 views
5

Tôi đang tìm kiếm một tương đương tao nhã của đoạn mã này sử dụng Java 8 của suối:Tạo một bản đồ sử dụng Java8 suối trên một cấu trúc dữ liệu lồng nhau

Collection<X> xs = ...; 
Map<B, A> map = new SomeMap<>(); 

for (X x : xs) { 
    A a = x.getA(); 
    Collection<B> bs = x.getBs(); 

    for (B b : bs) 
     map.put(b, a); 
} 

Đó là một là một chút quá khó khăn đối với tôi như tôi có thể không nghĩ về một sự kết hợp sử dụng flatMap và Collectors.toMap mà sẽ thực hiện các chức năng mong muốn.

compilable dụ:

import java.util.Arrays; 
import java.util.Collection; 
import java.util.HashMap; 
import java.util.Map; 

public class Application { 

    public static class A {} 

    public static class B {} 

    public static class X { 
     private A a; 
     private Collection<B> bs; 

     public X(A a, Collection<B> bs) { 
      this.a = a; 
      this.bs = bs; 
     } 

     public A getA() { 
      return a; 
     } 

     public Collection<B> getBs() { 
      return bs; 
     } 
    } 

    public static void main(String[] args) { 
     X x1 = new X(new A(), Arrays.asList(new B(), new B())); 
     X x2 = new X(new A(), Arrays.asList(new B())); 

     Collection<X> xs = Arrays.asList(x1, x2); 

     Map<B, A> map = new HashMap<>(); 

     for (X x : xs) { 
      A a = x.getA(); 
      Collection<B> bs = x.getBs(); 

      for (B b : bs) 
       map.put(b, a); 
     } 
    } 

} 
+1

Bạn có chắc chắn nó là 'xs.getA()'? – tkroman

+2

bạn khai báo một 'Bản đồ ' nhưng bạn sử dụng 'map.put (b, a)' - ý của bạn là gì? – assylias

+0

Ồ, vâng. Đó là Bản đồ . –

Trả lời

5

Như bạn nghĩ bạn có thể làm điều đó với một hỗn hợp của flatMap và toMap:

Map<B, A> map = xs.stream() 
        .flatMap(x -> x.getBs().stream() 
           .map(b -> new SimpleEntry<> (b, x.getA()))) 
        .collect(toMap(Entry::getKey, Entry::getValue)); 

Lưu ý rằng mã này khác với ban đầu của bạn nếu có trùng lặp Bs: mã của bạn sẽ tiếp tục ghi đè lên giá trị tương ứng trong khi mã này sẽ ném một ngoại lệ.

+1

Cách duy nhất tôi có được điều này để làm việc là bằng cách truyền luồng bên trong tới Luồng >. Nếu không, tôi sẽ gặp lỗi kiểu khi thu thập. –

+1

Với ví dụ của bạn, mã tôi đã đưa ra hoạt động tốt mà không cần phải tham gia. Bạn đã không quên '<>' trong 'new SimpleEntry <> (...)' bằng bất kỳ cơ hội nào? – assylias

+0

Có thể là phiên bản Java. Tôi đã thử nó trên một máy tính khác mà cùng một mã đã làm việc trong khi nó không có trên máy khác. –

Các vấn đề liên quan