Как преобразовать Список <Obj1> в Карту <Obj1.prop, Список <Obj1.otherProp> - PullRequest
0 голосов
/ 28 июня 2018

Как преобразовать список в карту списка, используя поток?

Я хочу конвертировать List<Obj> в Map<Obj.aProp, List<Obj.otherProp>>,
не только List<Obj> до Map<Obj.aProp, List<Obj>>

class Author {
    String firstName;
    String lastName;
    // ...
}

class Book {
    Author author;
    String title;
    // ...
}

Это список, который я хочу преобразовать:

List<Book> bookList = Arrays.asList(
        new Book(new Author("first 1", "last 1"), "book 1 - 1"),
        new Book(new Author("first 1", "last 1"), "book 1 - 2"),
        new Book(new Author("first 2", "last 2"), "book 2 - 1"),
        new Book(new Author("first 2", "last 2"), "book 2 - 2")
);

Я знаю, как это сделать:

// Map<Author.firstname, List<Book>> map = ...
Map<String, List<Book>> map = bookList.stream()
    .collect(Collectors.groupingBy(book -> book.getAuthor().getFirstName()));

Но что я могу сделать, чтобы получить это:

// Map<Author.firstname, List<Book.title>> map2 = ...
Map<String, List<String>> map2 = new HashMap<String, List<String>>() {
    {
        put("first 1", new ArrayList<String>() {{
            add("book 1 - 1");
            add("book 1 - 2");
        }});
        put("first 2", new ArrayList<String>() {{
            add("book 2 - 1");
            add("book 2 - 2");
        }});
    }
}; 

// Map<Author.firstname, List<Book.title>> map2 = ...
Map<String, Map<String, List<String>> map2 = bookList.stream(). ...
                                                                ^^^

1 Ответ

0 голосов
/ 28 июня 2018

Используйте Collectors.mapping для сопоставления каждого Book с соответствующим названием:

Map<String, List<String>> map = bookList.stream()
    .collect(Collectors.groupingBy(book -> book.getAuthor().getFirstName(),
                                   Collectors.mapping(Book::getTitle,Collectors.toList())));
...