Java 8 Collectors toMap

在使用Java stream的时候,会有需要将stream转换为Map的需求。

数据结构

下面的例子都会以图书信息作为实体。

public class Book {
    private String name;
    private Year releaseYear;
    private String isbn;

    // getters and setters
}

准备数据

List<Book> bookList = new ArrayList<>();
bookList.add(new Book("计算机程序的构造和解释", Year.of(2004), "9787111135104"));
bookList.add(new Book("算法导论", Year.of(2012), "9787111407010"));
bookList.add(new Book("计算机组成原理", Year.of(2017), "9787111558071"));
bookList.add(new Book("编译原理", Year.of(2008), "9787111251217"));
bookList.add(new Book("C程序设计语言(第2版·新版)", Year.of(2004), "9787111128069"));

toMaps

以ISBN作为key,以book作为value

bookList.stream().collect(Collectors.toMap(Book::getIsbn, Function.identity()))

以ISBN作为Key, 以书名作为value

bookList.stream().collect(Collectors.toMap(Book::getIsbn, Book::getName));

以年份为Key,统一年的书构建为一个list作为值

bookList.stream().collect(Collectors.toMap(
    Book::getReleaseYear,
    book -> {
        List<Book> books = new ArrayList<>();
        books.add(book)
        return books;
    },
    (prev, curr) -> {
        prev.addAll(curr);
        return prev;
    }
))