2015-06-16 31 views
7

Tôi có lớp này đơn giản Bean:Lập bản đồ một danh sách vào Map Java 8 dòng và groupingBy

public class Book {  

public Book(Map<String, String> attribute) { 
    super(); 
    this.attribute = attribute; 
} 
//key is isbn, val is author 
private Map<String, String> attribute; 

public Map<String, String> getAttribute() { 
    return attribute; 
} 
public void setAttribute(Map<String, String> attribute) { 
    this.attribute = attribute; 
} 

} 

Trong lớp học chính của tôi, tôi đã thêm một số thông tin vào Danh mục:

Map<String, String> book1Details = new HashMap<String, String>(); 
    book1Details.put("1234", "author1"); 
    book1Details.put("5678", "author2"); 
    Book book1 = new Book(book1Details); 

    Map<String, String> book2Details = new HashMap<String, String>(); 
    book2Details.put("1234", "author2"); 
    Book book2 = new Book(book2Details); 

    List<Book> books = new ArrayList<Book>(); 
    books.add(book1); 
    books.add(book2); 

Bây giờ tôi muốn chuyển đổi Danh sách sách thành bản đồ của biểu mẫu này:

Map<String, List<String>> 

Vì vậy, đầu ra (bản đồ ở trên) giống như:

//isbn: value1, value2 
1234: author1, author2 
5678: author1 

Vì vậy, tôi cần nhóm các mục nhập bằng isbn làm khóa và tác giả làm giá trị. Một isbn có thể có nhiều tác giả.

tôi đang cố gắng như dưới đây:

Map<String, List<String>> library = books.stream().collect(Collectors.groupingBy(Book::getAttribute)); 

Định dạng của đậu không thể thay đổi. Nếu đậu có giá trị chuỗi thay vì bản đồ, tôi có thể làm điều đó, nhưng bị mắc kẹt với bản đồ.

Tôi đã viết java 6/7 cách truyền thống để làm điều đó một cách chính xác, nhưng cố gắng làm điều đó thông qua Java 8 tính năng mới. Đánh giá cao sự trợ giúp.

Trả lời

9

Bạn có thể làm điều đó như thế này:

Map<String, List<String>> library = 
    books.stream() 
     .flatMap(b -> b.getAttribute().entrySet().stream()) 
     .collect(groupingBy(Map.Entry::getKey, 
          mapping(Map.Entry::getValue, toList()))); 

Từ Stream<Book>, bạn phẳng bản đồ nó với các dòng của mỗi bản đồ nó chứa nên bạn chỉ còn một Stream<Entry<String, String>>. Từ đó bạn nhóm các phần tử bằng khóa của mục và ánh xạ từng mục nhập với giá trị của nó mà bạn thu thập vào một Danh sách cho các giá trị.

+0

Hoàn hảo! Những công việc này. – daman

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