在本文中,我们将看到几个有关如何在Java8中对列表进行排序的示例。按字母顺序排列的字符串列表Listcities=Arrays.asList("Milan","伦敦”、“旧金山”、“东京”、“新德里”);System.out.println(cities);//[米兰、伦敦、旧金山、东京、新德里]cities.sort(String.CASE_INSENSITIVE_ORDER);System.out.println(cities);//[伦敦、米兰、新德里]德里、旧金山、东京]cities.sort(Comparator.naturalOrder());System.out.println(cities);//[Milan,NewDelhi,SanFrancisco,Tokyo,london]伦敦的“L”使用小写字母更好地突出显示String.CASE_INSENSITIVE_ORDER(返回不区分大小写的比较器)。基本上,在Java7中,我们使用Collection.sort()接受一个列表,最后是一个比较器——在Java8中,我们有新的List.sort()接受一个比较器。对整数列表进行排序Listnumbers=Arrays.asList(6,2,1,4,9);System.out.println(numbers);//[6,2,1,4,9]numbers.sort(Comparator.naturalOrder());System.out.println(数字);//[1,2,4,6,9]按字符串字段对列表进行排序假设我们有一个Movie类,我们想“按标题标题”对列表进行排序。我们可以使用Comparator.comparing(),传递一个函数来提取用于排序标题的字段-在这种情况下。Listmovies=Arrays.asList(newMovie("指环王"),newMovie("回到未来"),newMovie("Carlito'sway"),newMovie("低俗小说"));movies.sort(Comparator.comparing(Movie::getTitle));movies.forEach(System.out::println);输出:Movie{title='Backtothefuture'}Movie{title='Carlito'sway'}Movie{title='指环王'}Movie{title='Pulpfiction'}你可能会注意到我们没有通过任何比较器,但列表已正确排序。这是因为title-提取的字段-是一个字符串,而字符串实现了Comparable接口。如果您查看Comparator.comparing()实现,您会看到它在提取的键上调用compareTo。返回(Comparator&Serializable)(c1,c2)->keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));以类似的方式按double字段对列表进行排序,我们可以使用Comparator.comparingDouble()来比较double值。在我们的示例中,我们希望按照从最高到最低的评分对电影列表进行排序。Listmovies=Arrays.asList(newMovie(《指环王》,8.8),newMovie(《回到未来》,8.5),newMovie(《卡里托之路》,7.9),newMovie(“低俗小说”,8.9));movies.sort(Comparator.comparingDouble(Movie::getRating).reversed());movies.forEach(System.out::println);我们使用Comparator上的reversed函数将Go反转为默认的从低到高的自然顺序。Comparator.comparingDouble()在内部使用Double.compare()。如果需要比较int或long,则可以分别使用comparingInt()和comparingLong()。使用自定义比较器对列表进行排序在前面的示例中,我们没有指定任何比较器,因为这不是必需的,但让我们看一个定义我们自己的比较器的示例。我们的Movie类有一个新字段——“starred”——使用第三个构造函数参数设置。在我们的示例中,我们想要对列表进行排序,以便列表的顶部是加星标的电影。Listmovies=Arrays.asList(newMovie("指环王",8.8,true),newMovie("回到未来",8.5,false),newMovie("Carlito'sway",7.9,true),newMovie("Pulpfiction",8.9,false));movies.sort(newComparator(){@Overridepublicintcompare(Moviem1,Moviem2){if(m1.getStarred()==m2.getStarred()){return0;}returnm1.getStarred()?-1:1;}});movies.forEach(System.out::println);结果将是:Movie{starred=true,title='指环王',rating=8.8}Movie{starred=true,title='Carlito'sway',rating=7.9}Movie{starred=false,title='回到未来',rating=8.5}Movie{starred=false,title='Pulpfiction',rating=8.9}我们当然可以使用lambda表达式而不是Anonymous类,像这样:movies.sort((m1,m2)->{if(m1.getStarred()==m2.getStarred()){返回0;}returnm1.getStarred()?-1:1;});我们也可以再次使用Comparator.comparing():movies.sort(Comparator.comparing(Movie::getStarred,(star1,star2)->{if(star1==star2){return0;}returnstar1?-1:1;}));在最新的示例中,Comparator.comparing()将第一个参数作为提取用于排序的键的函数,并将Comparator作为第二个参数。比较器使用提取的键进行比较。star1和star2是真正的布尔值,分别是m1.getStarred()和m2.getStarred()。使用比较链对列表进行排序在最后一个示例中,我们希望将加星标的电影放在首位,然后按评分排序。Listmovies=Arrays.asList(newMovie("指环王",8.8,true),newMovie("回到未来",8.5,false),newMovie("Carlito'sway",7.9,true),newMovie("Pulpfiction",8.9,false));movies.sort(Comparator.comparing(Movie::getStarred).reversed().thenComparing(Comparator.comparing(Movie::getRating).reversed()));movies.forEach(System.out::println);输出为:Movie{starred=true,title='指环王',rating=8.8}Movie{starred=true,title='Carlito'sway',rating=7.9}Movie{starred=false,title='Pulpfiction',rating=8.9}Movie{starred=false,title='Backtothefuture',rating=8.5}如您所见,我们首先按星级,然后按评分排序——两者都颠倒了,因为我们想要最高的价值和真实第一。翻译链接:http://www.codeceo.com/article/java-8-comparator-sort-list.html英文原文:Java8Comparator:HowtoSortaList译者:码农-小风