java8 stream的多字段排序实现(踩坑)
作者:baomw 时间:2023-10-22 11:06:31
关于java8 的stream排序用法这里不做多说,这里介绍下曾经在多字段排序时遇到过的一个坑。
需求:需要根据id去分组,然后取出每组中行号最大的一个对象值。
想到可以利用stream的多字段排序,先按id去排,再看行号去排,demo代码如下:
class Tt{
private int id;
private int line;
public Tt(int id, int line) {
this.id = id;
this.line = line;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getLine() {
return line;
}
public void setLine(int line) {
this.line = line;
}
@Override
public String toString() {
return "Tt{" +
"id=" + id +
", line=" + line +
'}';
}
}
对象代码如上,只提供id和行号字段,做演示用:
测试代码如下:
public static void main(String[] args) {
List<Tt> list = new ArrayList<>();
list.add(new Tt(1,2));
list.add(new Tt(2,2));
list.add(new Tt(5,2));
list.add(new Tt(5,1));
list.add(new Tt(4,2));
list.add(new Tt(7,2));
list.add(new Tt(3,2));
List<Tt> sortedList = list.stream() .sorted(Comparator.comparing(Tt::getId)).sorted(Comparator.comparing(Tt::getLine))
.collect(Collectors.toList());
System.err.println(sortedList);
}
根据理论,应该是先根据id去排好序,再根据行号去排号序,效果应该是,按id顺序打印的。结果如下:
发现其实并不是想像的效果,结果是按后者顺序打印的。
由此推断出,当需要用到stram多条件排序的时候,需要最后排序的字段需要放在前面排,改后代码如下:
List<Tt> sortedList = list.stream() .sorted(Comparator.comparing(Tt::getLine)).sorted(Comparator.comparing(Tt::getId))
.collect(Collectors.toList());
效果如下:
达到预期,问题解决!
来源:https://blog.csdn.net/baomw/article/details/100916728
标签:java8,stream,多字段排序
0
投稿
猜你喜欢
SWT(JFace)体验之ApplicationWindow
2023-01-02 09:59:43
SpringMVC请求数据详解讲解
2021-09-13 08:56:56
浅谈Java异常的Exception e中的egetMessage()和toString()方法的区别
2022-05-27 00:37:31
Android中RecyclerView布局代替GridView实现类似支付宝的界面
2021-08-20 02:32:34
Android重要控件SnackBar使用方法详解
2022-11-10 04:49:41
Maven引入本地Jar包并打包进War包中的方法
2023-06-16 12:43:28
java控制线程运行
2023-03-05 15:35:30
利用枚举法求直方图中最大矩形面积的方法实例
2022-06-22 21:16:31
spring boot 集成 shiro 自定义密码验证 自定义freemarker标签根据权限渲染不同页面(推荐
2023-07-28 17:39:16
Java通过反射将 Excel 解析成对象集合实例
2023-05-22 18:49:02
C# 程序集和反射详解
2022-12-29 20:24:18
Java+Selenium实现文件上传下载功能详解
2021-06-23 23:33:23
Android巧用ActionBar实现tab导航效果
2022-06-02 05:49:18
java实现学生信息管理系统
2023-11-11 08:22:35
SimpleCommand实现图片下载(二)
2023-05-21 00:25:17
Java实现的微信图片处理工具类【裁剪,合并,等比例缩放等】
2022-03-26 11:32:59
springboot-2.3.x最新版源码阅读环境搭建(基于gradle构建)
2022-11-19 01:47:41
Maven管理SpringBoot Profile详解
2022-03-20 09:57:45
从try-with-resources到ThreadLocal,优化你的代码编写方式
2023-11-11 03:19:52
基于Android实现桌面悬浮清内存app概述
2023-05-02 22:56:35