使用Java流对集合进行分组

时间:2018-08-15 17:58:52

标签: java java-stream

我遇到了一些困难,难以找到可以完成以下工作的漂亮代码(以下用例只是一个例子):

用例:

我有学生,每个学生都有一本藏书。 对于每本书,我需要知道哪个学生拥有。 请注意,一本书可以由多个学生拥有。

代码: 我有一个Set<Student>作为输入, 我需要创建一个Map<Book, Set<Student>>作为输出。


我知道如何不使用lambda和流来做到这一点,但我想学习如何使用它。

当前,我已经创建了一个中间内部类(Tuple(Book,Student))来实现它,但是它看起来很脏,我得到了一个Map<Book, Tuple<Book, Student>>,它不能完全满足我的需求。

students.parallelStream()
    .flatMap(student-> student.getBooks().parallelStream()
        .map(book -> new Tuple(book, student)))
    .collect(Collectors.groupingBy(tuple-> tuple.book, Collectors.toSet()))

1 个答案:

答案 0 :(得分:3)

您可以在收集期间使用Collectors.mapping来转换元组:

Map<Book, Set<Student>> result = students.parallelStream()
        .flatMap(student -> student.getBooks()
                                .parallelStream()
                                .map(book -> new Tuple(book, student)))
        .collect(Collectors.groupingBy(tuple -> tuple.book,
                Collectors.mapping(tuple -> tuple.student, Collectors.toSet())));