推广 热搜: page  音视频  使用  个数  搜索引擎  选择  企业  可以  百度  父亲 

Java 8 集合排序的 10 个姿势

   日期:2024-12-27     作者:waxbv    caijiyuan   评论:0    移动:http://ww.kub2b.com/mobile/news/13256.html
核心提示:今天栈长就分享 Java 8 进行排序的 10 个姿势,原来还有这么多排序技巧,其实就是把 Java 8 中的 Lambda、Stream、

今天栈长就分享 Java 8 进行排序的 10 个姿势,原来还有这么多排序技巧,其实就是把 Java 8 中的 Lambda、Stream、方法引用等知识点串起来,栈长的同事直呼还看不懂。。

现在有一个 List 集合

 

jdk8 之前的排序

 

在 Java 8 出来之前,排序基本上要这么写,可是 Java 8 都出来这么多年了,你还在这么排序那就太 Low 了

对 Java 8 新增的知识点这篇不再详述,还不会用的可以关注公众号:Java 技术栈,在后台回复:java,Java 8+ 系列教程我都写了一堆了。

本篇就直接上干货,看我怎么用 Java 8 排序

1、Lambda 排序(带参数类型

Java 8 中的 List 接口新增了一个 sort 默认方法

接收 Comparator 接口参数,这个接口在 Java 8 中被修饰为函数式接口

然后我们就可以把 Comparator 接口参数改成了用 Lambda 表达式的形式,用 Lambda 表达式干掉了匿名内部类,让代码更简洁。

使用示例如下

 
2、Lambda 排序(不带参数类型

Lambda 表达式是可以不用带参数类型的,如下示例

 

代码中的 u1, u2 并没有用 User 类修饰,它会自动推断为 User 类型,因为集合本身就是一个 User 泛型。

3、静态方法引用排序

除了 Lambda 表达式,还可以用类的静态方法引用

 

使用方法引用之后代码是不是更简洁了

4、实例方法引用排序

不仅可以用类的静态方法,还可以用类的实例普通方法引用

 

这个 getInstance 在这里实际上是一个单例,但和单例无关,任何类的实例都可以。

另外,这些知识点我也整理到了小程序,都是面试常考的,大家可以在 Java 面试库小程序在线刷题。

5、Comparator 工具类排序(升序

Java 8 在 Comparator 接口中新增了 comparing 方法

这个工具方法需要提供一个函数式接口参数,也就是要比较的哪个字段,最后还是返回 Comparator 接口实例。

使用示例如下

 

既然是函数式接口,所以又可以用 Lambda、方法引用形式作为参数传入。

本文所有完整示例源代码已经上传

https://github.com/javastacks/javastack

6、Comparator 工具类排序(降序

还可以使用 Comparator.reversed/ reversedOrder 方法进行降序

 

Comparator.reversed 和 reversedOrder 的区别在于,reversedOrder 适用于基本数据类型的集合的自然排序,而 reversed 是对 Comparator 自身的封装,适用于对象的自定义排序。

7、组合排序

如果要先按用户的年龄排序,年龄相同的再按姓名排序,可以使用 Comparator 接口中的 thenComparing 默认方法

 

输出结果

 

注意年龄 26 岁的人又按姓名按自然顺序排序了。

8、Stream 排序

还可以把 List 集合转换为 Stream,然后使用其 sorted 方法

sorted 方法也是接收 Comparator 接口参数,所以我们也可以使用 Lambda、方法引用、Comparator 接口自身提供的工具方法对其调用

 

所以使用 Stream 也可以扩展多种排序方法,见注释部分,这里就不展开了。另外,Stream 系列我之前写过一个专题了,这里不再展开,不懂的关注公众号 Java 技术栈,然后在公众号 Java 教程菜单中阅读。

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 万数据的集合,使用静态方法引用进行测试

 

输出结果

List.sort: 18
Collections.sort: 18
Stream.sorted: 48

Stream 要略慢,因为多了两道转换的工序,但如果不是特别大的数据量,比如 1000 条数据的集合,这 3 个几乎性能一样,基本都在 1 毫秒内完成排序,对于普通小数据的排序可以闭着眼睛用了。

所以,你学废了吗?赶紧用在项目中吧,提升自己的硬实力,让同事对你刮目相看!再啰嗦一句,对 Java 8 新增的知识点还不会用的可以关注公众号:Java 技术栈,在后台回复:java,Java 8+ 系列教程我都写了一堆了。

你还知道哪些排序技巧?欢迎留言分享

本文所有完整示例源代码已经上传

https://github.com/javastacks/javastack

本文地址:http://ww.kub2b.com/news/13256.html     企库往 http://ww.kub2b.com/ ,  查看更多

特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。

 
 
更多>同类最新文章
0相关评论

文章列表
相关文章
最新动态
推荐图文
最新文章
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号