stream排序

本文详细介绍了如何使用Java Stream的sorted方法进行多种条件的排序操作,包括单一字段的升序和降序,以及多个字段复合排序。通过实例展示了Comparator的各种用法,如reversed()和Comparator.reverseOrder()的差异,并提供了多个排序练习案例,帮助读者深入理解Stream排序的灵活性。
摘要由CSDN通过智能技术生成

stream如何排序?

使用stream中sorted方法

怎么使用?

1:创建实体类。2:创建list。3:用list.stream().sorted();
如图所示:
在这里插入图片描述

List<Test> list = new ArrayList<>();

        Test test = new Test();
        test.setName("张三");
        test.setAge(18);
        test.setState(1);
        test.setCreateTime(new Date());
        list.add(test);

        Test test2 = new Test();
        test2.setName("李四");
        test2.setAge(19);
        test2.setState(1);
        test2.setCreateTime(new Date());
        list.add(test2);

        Test test3 = new Test();
        test3.setName("王五在·");
        test3.setAge(15);
        test3.setState(2);
        test3.setCreateTime(new Date());
        list.add(test3);

        for (Test it: list) {
            System.out.println(it);
        }

输入可以用

list.forEach(System.out::println);

代替

for (Test it: list) {
	System.out.println(it);
}

然后我们做几个例子,让大家理解一下排序。

练习1:让年龄进行倒序排序。

练习2:让使用状态进行升序排序。

练习3:让使用状态和年龄都进行倒序排序。

练习4:让使用状态和年龄都进行升序排序。

练习5:让使用状态进行升序排序,年龄进行倒序排序,创建时间进行倒序排序。


练习1:让年龄进行倒序排序。

在这里插入图片描述
怎么做到的呢?首先把list转成stream流,然后就可以使用sorted(排序)方法。写法就是:

list = list.stream()
                .sorted(Comparator.comparing(Test::getAge).reversed())
                .collect(Collectors.toList());
list.forEach(System.out::println);

说明:Comparator.comparing(放实体类名称::放列名):添加排序字段;
reversed():倒序。
collect(Collectors.toList()):转成集合。
list.forEach(System.out::println):打印循环。

写法二:

list = list.stream()
                .sorted(Comparator.comparing(Test::getAge, Comparator.reverseOrder()))
                .collect(Collectors.toList());
list.forEach(System.out::println);

说明:这里的Comparator.reverseOrder()等于reversed()。那么问题来了,为什么会有两种这种写法?继续请看下面的例子,就知道了。

写法还可以在简单一点,如下:

list.stream()
.sorted(Comparator.comparing(Test::getAge, Comparator.reverseOrder()))
.forEach(System.out::println);

练习2:让使用状态进行升序排序。
在这里插入图片描述
因为默认是升序,所以只需要把排序字段放进去就行了。


练习3:让使用状态和年龄都进行倒序排序。

向这种情况多个条件,用.thenComparing()拼接到后面。如下:
在这里插入图片描述
先根据使用状态倒序,而王五使用状态为2,所以王五排在第一。而李四和张三使用状态都是1,就会触发另一个排序条件根据年龄排序,所以李四排在第二,张三排在第三。

写法二:
在这里插入图片描述
两种写法都可以到达目的,此时我们可以总结一下。
Comparator.reverseOrder()是让某个条件进行倒序排序.
reversed()是让他前面的字段进行倒序。

例如:Comparator.comparing(名称).reversed(),此时名称倒序;
Comparator.comparing(名称).thenComparing(状态).reversed(),此时名称和状态进行倒序。

Comparator.comparing(名称).thenComparing(状态).reversed().thenComparing(年龄),此时名称和状态会倒序,年龄会升序。

那么问题来了,咱们加多个.reversed()会发生什么事情?
变成Comparator.comparing(状态).reversed().thenComparing(年龄).reversed()
结果如下:
在这里插入图片描述
我们看见状态并未排序,只有年龄排序了。所以我们可以得出多个reversed()以最后一个为准。
1.假如多个排序条件都为倒序,reversed()应该写在最后。
2.假如多个排序条件的排序方向不一致,需要倒序的字段应该用Comparator.reverseOrder()。

练习4:让使用状态和年龄都进行升序排序。

这个就简单,不加reversed即可,默认就是升序
在这里插入图片描述


练习5:让使用状态进行升序排序,年龄进行倒序排序,创建时间进行倒序排序。

注意:假如多个排序条件的排序方向不一致,需要倒序的字段应该用Comparator.reverseOrder()。

在这里插入图片描述
最后,学习快乐!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值