Code:
public class Main {
public static void main(String[] args) {
List<Book> books = new ArrayList<>();
books = List.of(new Book("Aus dem All", "Horror", "Stephen King"),
new Book("Evil", "Horror", "Stephen King"),
new Book("See House", "Fantasy", "Anthony Marc"),
new Book("Scream", "Thriller", "Larissa Vega"),
new Book("Killer Hamster", "Horror", "Stephen King"),
new Book("Who killed Ben?", "Thriller", "Stephen King"),
new Book("The Hills have Eyes", "Horror", "Manfred Meyer"),
new Book("Lost Love", "Drama", "Benedikt Hold"),
new Book("Office Killer", "Horror", "Stephen King"));
// group list of books by author
Map<String, List<String>> collect = books.stream()
.collect(Collectors.groupingBy(Book::getAuthor,
Collectors.mapping(Book::getTitle, Collectors.toList()))
);
System.out.println(collect);
}
}
收集结果:{Benedikt Hold=[失落的爱],曼弗雷德·迈耶=[山上有眼睛],拉里萨·维加=[尖叫],安东尼·马克=[见房子],斯蒂芬·金=[Aus dem All,邪恶,杀手仓鼠,谁杀死了本?,办公室杀手]}
我希望地图键按作者排序。 "安东尼·马克"应该是第一位的,然后是"贝内迪克特·霍尔德"等等。
我尝试在终端操作收集之前对流进行排序:
.sorted((b1,b2) -> b1.getAuthor().compareTo(b2.getAuthor(
)))但结果是一样的。
有谁知道我如何在流语句中对结果进行排序?(我不想在流之后排序,我想在我的流语句中排序)
groupingBy
收集的地图不保证是排序的地图。例如,它可以是一个HashMap
,就其本质而言,它的键值对没有顺序。
您可以指定要groupingBy
收集到的地图类型:
Collectors.groupingBy(Book::getAuthor,
TreeMap::new,
Collectors.mapping(Book::getTitle, Collectors.toList()))
TreeMap
的默认构造函数创建一个TreeMap
,该按键的自然顺序对键值对进行排序,这似乎是您在此处想要的顺序。