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

时间:2021-05-19

关于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());

效果如下:


达到预期,问题解决!

到此这篇关于java8 stream的多字段排序实现(踩坑)的文章就介绍到这了,更多相关java8 stream多字段排序内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章