Java8比较器:列表排序的深入讲解

  

在本文中,我们将看到几个关于如何在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()>         返回(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比较器:列表排序的深入讲解