考虑一个列表List<People>,其中元素按升序排序People.getAge().如果我们使用此列表进行分组Collectors.groupingBy(People::getCity),那么每个组/城市的结果列表是否仍按年龄排序?
在实践中,它确实似乎保留了秩序.我正在寻找保证.
该方法的Javadoc说:
如果不需要保留元素出现在生成的Map收集器中的顺序,则使用groupingByConcurrent(Function)可以提供更好的并行性能
我不确定这是否是指列表中的项目顺序.
我用的情况下遇到的,当我需要转换List<Book>到Map<String, Book>和唯一的解决办法我能找到的是怎么做的Map<String, List<Book>>.
类本身看起来如下(我省略了getter/setters和构造函数):
public class Book {
private String asin;
private String author;
private String title;
}
Run Code Online (Sandbox Code Playgroud)
我希望通过某些唯一的密钥映射所有书籍,因此重复的可能性要么是可忽略的,要么是0.
我试着这样做:
Map<String, Book> booksByAsinAndTitle = books.stream()
.collect(Collectors.groupingBy((book) -> book.getAsin() + "||" + book.getTitle()))
.entrySet()
.stream()
.collect(Collectors.toMap(x -> x.getKey(), x -> x.getValue().get(0)));
Run Code Online (Sandbox Code Playgroud)
它可以工作,但它看起来很难看,几乎不可读,并且在代码库中不太好,因为它可能会让我的同事感到困惑.有没有更好的方法java 8来达到相同的结果?