我遇到了一些困难,难以找到可以完成以下工作的漂亮代码(以下用例只是一个例子):
用例:
我有学生,每个学生都有一本藏书。 对于每本书,我需要知道哪个学生拥有。 请注意,一本书可以由多个学生拥有。
代码:
我有一个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()))
答案 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())));