在开始之前, 我先卖个关子提一个问题: 假设我们有一个 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 节》 http://springboot.zimug.com/
来源: https://www.cnblogs.com/zimug/p/11769554.html