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顺序打印的。结果如下:

java8 stream的多字段排序实现(踩坑)

发现其实并不是想像的效果,结果是按后者顺序打印的。
由此推断出,当需要用到stram多条件排序的时候,需要最后排序的字段需要放在前面排,改后代码如下:


List<Tt> sortedList = list.stream() .sorted(Comparator.comparing(Tt::getLine)).sorted(Comparator.comparing(Tt::getId))
       .collect(Collectors.toList());

效果如下:

java8 stream的多字段排序实现(踩坑)

达到预期,问题解决!

来源: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
  • asp之家 软件编程 m.aspxhome.com