Comparator.comparing排序的坑

差不多先生的个人空间 java 正文

java8 stream多字段排序
xiaomin0322 xiaomin0322 发布于 2019/11/02 11:38 字数 1012 阅读 200 收藏 3 点赞 0 评论 0
Java
注:转载请注明出处!!!

很多情况下sql不好解决的多表查询,临时表分组,排序,尽量用java8新特性stream进行处理

使用java8新特性,下面先来点基础的

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

List<类> list; 代表某集合

//返回 对象集合以类属性一升序排序

list.stream().sorted(Comparator.comparing(类::属性一));

//返回 对象集合以类属性一降序排序 注意两种写法

list.stream().sorted(Comparator.comparing(类::属性一).reversed());//先以属性一升序,结果进行属性一降序

list.stream().sorted(Comparator.comparing(类::属性一,Comparator.reverseOrder()));//以属性一降序

//返回 对象集合以类属性一升序 属性二升序

list.stream().sorted(Comparator.comparing(类::属性一).thenComparing(类::属性二));

//返回 对象集合以类属性一降序 属性二升序 注意两种写法

list.stream().sorted(Comparator.comparing(类::属性一).reversed().thenComparing(类::属性二));//先以属性一升序,升序结果进行属性一降序,再进行属性二升序

list.stream().sorted(Comparator.comparing(类::属性一,Comparator.reverseOrder()).thenComparing(类::属性二));//先以属性一降序,再进行属性二升序

//返回 对象集合以类属性一降序 属性二降序 注意两种写法

list.stream().sorted(Comparator.comparing(类::属性一).reversed().thenComparing(类::属性二,Comparator.reverseOrder()));//先以属性一升序,升序结果进行属性一降序,再进行属性二降序

list.stream().sorted(Comparator.comparing(类::属性一,Comparator.reverseOrder()).thenComparing(类::属性二,Comparator.reverseOrder()));//先以属性一降序,再进行属性二降序

//返回 对象集合以类属性一升序 属性二降序 注意两种写法

list.stream().sorted(Comparator.comparing(类::属性一).reversed().thenComparing(类::属性二).reversed());//先以属性一升序,升序结果进行属性一降序,再进行属性二升序,结果进行属性一降序属性二降序

list.stream().sorted(Comparator.comparing(类::属性一).thenComparing(类::属性二,Comparator.reverseOrder()));//先以属性一升序,再进行属性二降序


通过以上例子我们可以发现

  1. Comparator.comparing(类::属性一).reversed();

  2. Comparator.comparing(类::属性一,Comparator.reverseOrder());

两种排序是完全不一样的,一定要区分开来 1 是得到排序结果后再排序,2是直接进行排序,很多人会混淆导致理解出错,2更好理解,建议使用2

实际例子:

现有一个类test 有两个属性:state 状态 time 时间,需要状态顺序且时间倒序

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

class test {

//状态

private int state;

//时间

private Date time;



public test(int state, Date time) {

    this.state = state;

    this.time = time;

}



public int getState() {

    return state;

}



public void setState(int state) {

    this.state = state;

}



public Date getTime() {

    return time;

}



public void setTime(Date time) {

    this.time = time;

}



@Override

public String toString() {

    return "test{" +

            "state=" + state +

            ", time=" + DateUtils.formatDateYMD(time) +

            '}';

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

class testRun {

public static void main(String[] args) {

    List testList = new ArrayList<>();

    Date d = DateUtils.now();

    for (int i = 1; i <= 3; i++) {

        test t = new test(i, DateUtils.addDays(d, i));

        testList.add(t);

    }

    for (int i = 1; i <= 3; i++) {

        test t = new test(i, DateUtils.addMonths(d, i));

        testList.add(t);

    }



    testList.forEach(o -> {

        System.out.println(o.toString());

    });

    List sort = testList.stream().sorted(Comparator.comparing(test::getState).thenComparing(test::getTime,Comparator.reverseOrder())).collect(toList());

    System.out.println("------------------------------------");

    sort.forEach(o -> {

        System.out.println(o.toString());

    });





}

}

运行结果:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

排序前:

test{state=1, time=2019-07-24}

test{state=2, time=2019-07-25}

test{state=3, time=2019-07-26}

test{state=1, time=2019-08-23}

test{state=2, time=2019-09-23}

test{state=3, time=2019-10-23}


排序后:

test{state=1, time=2019-08-23}

test{state=1, time=2019-07-24}

test{state=2, time=2019-09-23}

test{state=2, time=2019-07-25}

test{state=3, time=2019-10-23}

test{state=3, time=2019-07-26}

Process finished with exit code 0

本文转载自:https://www.cnblogs.com/kuanglongblogs/p/11230250.html

打印 举报
上一篇:
Lombok中关于@Data的使用 坑
下一篇:
限流器及Guava实现分析-限流算法
xiaomin0322
xiaomin0322粉丝 151 博文 4074 码字总数 216603 作品 2 上海 架构师
评论(0)
在这里发表你对此文的观点
0/1000
关于java8排序的实例讲解
java8以前 在java以前为了对集合排序,通常的做法是这样的 bean如下 private static class Person { } //这个例子是对集合中的元素按照年龄进行排序Collections.sort(people, new Comparator…

光与热的博客 2017/12/21 0 0
Java8解决了什么?
在学习面向对象时,许多人都会用Java来举例子,但是其实Java并非纯正的面向对象语言,最明显的就是:int,double等基本类型不是对象。 自从java8出来过后,引入了流,函数式编程,就更不是在向…

MageekChiu 2017/08/02 0 0
Java8函数式编程的宏观总结
1.java8优势 通过将行为进行抽象,java8提供了批量处理数据的并行类库,使得代码可以在多核CPU上高效运行。 2.函数式编程的核心 使用不可变值和函数,函数对一个值进行处理,映射成另一个值。…

caoxiaohong1005 2018/03/18 0 0
跟上Java8 - Stream API快速入门
跟上Java8 - Stream API快速入门 王爵的技术博客2017-07-1821 阅读 streamfilterJava8 在前面我们简单介绍了 表达式,Java8旨在帮助程序员写出更好的代码, 其对核心类库的改进也是关键的一部…

王爵的技术博客 2017/07/18 0 0

Java8中对HashMap的Value值进行排序
Java8中对HashMap的Value值进行排序 一号门-程序员的工作,程序员的生活(java,python,delphi实战)2017-10-08247 阅读 Java 在Java8中对java.util.Comparator 和 Map.Entry 增加了新的方法用来…

一号门-程序员的工作,程序员的生活(java,python,delphi实战) 2017/10/08 0 0
OSCHINA 社区
关于我们
联系我们
合作伙伴
Open API
在线工具
码云 Gitee.com
企业研发管理
CopyCat-代码克隆检测
实用在线工具
微信公众号
微信公众号
OSCHINA APP
聚合全网技术文章,根据你的阅读喜好进行个性推荐

©OSCHINA(OSChina.NET) 工信部 开源软件推进联盟 指定官方社区 深圳市奥思网络科技有限公司版权所有 粤ICP备12009483号
返回顶部
顶部

你可能感兴趣的:(后端)