像使用SQL一样对List对象集合进行排序

27次阅读

共计 1453 个字符,预计需要花费 4 分钟才能阅读完成。

在开始之前,我先卖个关子提一个问题:假设我们有一个 Movie 类,这个类有三个成员变量分别是 starred(是否收藏), title(电影名称), rating(评分)。你知道怎么对一个 Movie 对象组成的 List 集合,先按照是否收藏字段倒序排序,再按照评分的倒序进行排序么?如果您不知道 4 行代码以内的解决方案(其实是 1 行代码就可以实现,但笔者格式化为 4 行),我觉得您有必要一步步的看下去。

在 java 8 之前,实现对象 Collection 排序,集合中被排序和比较大小的对象得实现 Comparable 接口。在 java 8 之后,有了 Comparator 比较器的概念,使用 Comparator 完成对象数组的排序更加方便快捷,下面就给大家简单的介绍一下 java 8 中使用 Comparator 排序的方法。

一、字符串 List 排序

  • cities 是一个字符串数组。注意 london 的首字母是小写的。
  • 当使用 sort 方法,按照 String.CASE_INSENSITIVE_ORDER(字母大小写不敏感)的规则排序,结果是:[london, Milan, New Delhi, San Francisco, Tokyo]
  • 如果使用 Comparator.naturalOrder()字母自然顺序排序,结果是:[Milan, New Delhi, San Francisco, Tokyo, london]

在 java 7 我们是使用 Collections.sort()接受一个数组参数,对数组进行排序。在 java 8 之后可以直接调用集合类的 sort()方法进行排序 。sort() 方法可以传入一个字符串的排序规则,如:String.CASE_INSENSITIVE_ORDER,也可以传入一个排序器 Comparator.naturalOrder()作为参数。

二、整数类型 List 排序

按数字的自然顺序排序,结果是[1, 2, 4, 6, 9]

三、按对象字段对对象 List 排序

这个功能就比较有意思了,举个例子大家理解一下。假设我们有一个类 Movie,有三个成员变量分别是 starred(是否收藏), title(电影名称), rating(评分)。

  • 首先,我们创建了四个 Movie 对象,然后将它们转换为 List
  • 然后重点的的代码: 使用了函数应用 Movie::getTitle 作为对象的排序字段,即按照电影的 title 作为排序字段
  • 然后调用 List 的 forEach 方法将 List 排序结果打印出来,如下(当然我们重写了 toString 方法,不然打印结果没有意义):

  • 如果我们希望 List 按照 Title 的倒序排序,就使用 reversed()方法。如:Comparator.comparing(Movie::getTitle).reversed()。

四、使用自定义 Comparator 排序

我们自定义一个排序器,实现 compare 函数。返回 0 表示元素相等,- 1 表示前一个元素小于后一个元素,1 表示前一个元素大于后一个元素。这个规则似乎和 java 8 之前没什么区别。

最终的打印结果如下,按照 started 的自定义规则进行排序。

这段代码如果以 lambda 表达式简写。箭头左侧是参数,右侧是函数体,参数类型和返回值根据上下文自动判断。如下:

五、通过 Comparator 链对 对象 List排序

上面这段代码先是按是否收藏的倒序排序,再按照电影的评分大小的倒序排序,排序结果如下:

期待您的关注

  • 博主最近新写了一本书:《手摸手教您学习 SpringBoot 系列 -16 章 97 节》
  • 本文转载注明出处(必须带连接,不能只转文字):字母哥博客。
正文完
 0