在本文中,我们将看到几个关于如何在Java 8中对列表进行排序的示例。
List城市=arrays . aslist ( “米兰”, “伦敦”, “三藩市”, “东京”, “新德里” ); System.out.println(城市);//(米兰、伦敦、旧金山、东京、新德里) cities.sort (String.CASE_INSENSITIVE_ORDER); System.out.println(城市);//(伦敦、米兰、新德里、旧金山、东京) cities.sort (Comparator.naturalOrder ()); System.out.println(城市);//(米兰,新德里、旧金山、东京、伦敦)
为了更加突出显示<代码> Comparator.naturalOrder() 代码>(返回按照大小写字母排序的比较器)和String.CASE_INSENSITIVE_ORDER(返回不区分大小写的比较器)的区别,我们在“伦敦”使用小写的‘L’。
基本上,在Java 7中,我们使用的<代码> Collections.sort() 代码>方法接受一个列表参数,最终返回一个比较器,而在Java 8中新的List . sort()就<代码> 代码>方法,它接受比较器参数。
List数量=数组。asList (6、2、1、4、9); System.out.println(数字);//[6、2、1,4,9] numbers.sort (Comparator.naturalOrder ()); System.out.println(数字);//[1,2,4,6,9]
假设我们有电影类,想按标题对列表进行排序。我们可以使用<代码> Comparator.comparing() 代码>并传递用于排序的字段——在本例中为标题。
List电影=arrays . aslist ( 新电影(“指环王”), 新电影(“回到未来”), 新电影(“冲突”), 新电影(“低俗小说”)); movies.sort (Comparator.comparing(电影::getTitle)); movies.forEach (system . out:: println);
输出是:
电影{title=盎氐轿蠢础眪
引用>
电影{title=俺逋弧眪
电影{title=爸富吠酢眪
电影{title=暗退仔∷怠眪
你可能已经注意到,我们没有通过比较器(比较),但名单已正确排序,这是因为提取的字段标题是字符串类型,而字符串实现了可比接口。
如果你查看<代码> Comparator.comparison()> 代码的实现,你将看到它对提取的键调用compareTo方法。
返回(Comparator,可串行化的) (c1, c2)→keyExtractor.apply (c1) .compareTo (keyExtractor.apply (c2));
以类似的方式,可以使用<代码> Comparator.comparingDouble() 代码>来比较双值。在示例中,我们希望通过评级从高到低来对电影列表进行排序。
List电影=arrays . aslist ( 新电影(8.8“指环王”), 新电影(“回到未来”,8.5), 新电影(“冲突”,7.9), 新电影(“低俗小说”,8.9)); movies.sort (Comparator.comparingDouble(电影::getrate) .reversed ()); movies.forEach (system . out:: println); 我们使用反转函数(逆转)来反转默认从低到高的自然排序,<代码> Comparator.comparingDouble() 代码>底层使用<代码> Double.compare() 代码>实现。如果需要比较int或长,可以分别使用<代码> comparisonInt() 代码>和<代码> comparisonLong() 代码>。
在前面的例子中,没有指定任何比较器,因为没有必要。现在让我们看一个自定义比较器的例子。
我们的电影类有一个新字段——“主演”。使用第三个构造函数设置参数。在示例中,我们要对列表进行排序,以便在列表顶部显示已加星标的电影。List电影=arrays . aslist ( 新电影(“指环王”,8.8,真的), 新电影(“回到未来”,8.5,false), 新电影(“冲突”,7.9,真的), 新电影(“低俗小说”,8.9,false)); 电影。排序(新的Comparator () { @Override 公共int比较(电影电影m1、m2) { 如果(m1.getStarred ()==m2.getStarred ()) { 返回0; } 返回m1.getStarred () & # 63;1:1; } }); movies.forEach (system . out:: println); 结果是:
电影{主演=true, title=爸富吠酢?评级=8.8}
电影{主演=true, title=俺逋弧?评级=7.9}
电影{主演=false, title=盎氐轿蠢础?评级=8.5}
电影{主演=false, title=暗退仔∷怠?评级=8.9}Java8比较器:列表排序的深入讲解