今天分享 Java 8 进行排序的 10 个姿势,其实就是把 Java 8 中的 Lambda、Stream、方法引用等知识点串起来
现在有一个 List 集合:
jdk8 之前的排序:
使用示例如下:
2、Lambda 排序(不带参数类型)
Lambda 表达式是可以不用带参数类型的,如下示例:
代码中的 u1, u2 并没有用 User 类修饰,它会自动推断为 User 类型,因为集合本身就是一个 User 泛型。
3、静态方法引用排序
除了 Lambda 表达式,还可以用类的静态方法引用:
使用方法引用之后代码是不是更简洁了?
4、实例方法引用排序
不仅可以用类的静态方法,还可以用类的实例普通方法引用:
这个 getInstance 在这里实际上是一个单例,但和单例无关,任何类的实例都可以。
使用示例如下:
既然是函数式接口,所以又可以用 Lambda、方法引用形式作为参数传入。
6、Comparator 工具类排序(降序)
还可以使用 Comparator.reversed/ reversedOrder 方法进行降序:
7、组合排序
如果要先按用户的年龄排序,年龄相同的再按姓名排序,可以使用 Comparator 接口中的 thenComparing 默认方法:
所以使用 Stream 也可以扩展多种排序方法,见注释部分,这里就不展开了
9、并行 Stream 排序
有 Stream 排序,那就并行 Stream(parallelStream)排序:
10、Collections 排序
既然在 Java 8 中,Comparator 接口被定义成了函数式接口,那么我们传统的 Collections 工具类就可以改变了,我们也可以使用 Lambda、方法引用、Comparator 接口自身提供的工具方法对其调用:
本文列举了 Java 8 中的 10 种排序方法,其实就是 10 个案例,还可以扩展更多,只是给大家个参考,总体来说,其实可以分为 3 大类:
List 接口中的 sort 方法
Stream 接口中的 sorted 方法
Collections.sort 工具类方法
这三个方法都可以接收 Comparator 接口作为参数,并且 Comparator 接口在 Java 8 中被定义成了函数式接口,所以我们可以用 Lambda 表达式、方法引用、Comparator 自身工具类等不同的参数形式传入,可谓是太秀了。
这些方法性能如何呢?
写了一个小例子,1 万数据的集合,使用静态方法引用进行测试:
输出结果: