如何在同一个stream语句中对collectors.groupedby的结果进行排序?

niknxzdl  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(351)

这个问题在这里已经有答案了

如何在java8中通过lambda表达式将Map转换为sortedmap(1个答案)
Java8流api tomap转换为treemap(2个答案)
两天前关门了。
代码:

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=[失去的爱],manfred meyer=[山有眼睛],larissa vega=[尖叫],anthony marc=[看房子],stephen king=[所有,邪恶,杀手仓鼠,谁杀了本?办公室杀手]}
我希望Map键按作者排序。”安东尼·马克“应该是第一个,然后是贝内迪克·霍尔德”等等。。
我尝试在终端操作collect之前对流进行排序:
.sorted((b1,b2)->b1.getauthor().compareto(b2.getauthor()))
但结果是一样的。
有人知道如何在流语句中对结果进行排序吗(我不想在溪流之后把它分类。我想在我的流语句中排序)

um6iljoc

um6iljoc1#

收集的Map groupingBy 不保证是排序的Map。例如,它可能是 HashMap ,就其本质而言,它在键值对中没有顺序。
可以指定所需的Map类型 groupingBy 收集到:

Collectors.groupingBy(Book::getAuthor,
                 TreeMap::new,
                 Collectors.mapping(Book::getTitle, Collectors.toList()))

的默认构造函数 TreeMap 创建 TreeMap 它按键的自然顺序排列键值对,这似乎是您在这里想要的顺序。

相关问题