包装模板网站,微信服务号菜单链接网站怎么做的,网站建设的市场定位,公司官网怎么做文章目录前言假设业务场景排序前的准备正序排序1、数据集合的判空 Optional.isPresent()2、使用sort排序3、将排序后的数据流转换为list你以为这样就完了#xff1f;倒序排序前言
之前#xff0c;针对Stream链式编程中的几个方法做了大致的说明。详情可以参考#xff1a; J…
文章目录前言假设业务场景排序前的准备正序排序1、数据集合的判空 Optional.isPresent()2、使用sort排序3、将排序后的数据流转换为list你以为这样就完了倒序排序前言
之前针对Stream链式编程中的几个方法做了大致的说明。详情可以参考 JDK 1.8 新特性之Stream 详解个人笔记 但实际业务中总会存在很多复杂的思维需要使用到Stream此时玩的不熟练总感觉无从下手。
今后开始写几种常用的逻辑方式。
假设业务场景
在数据查询出来后需要针对集合中的数据信息按照某一字段进行正序或倒序排序。
排序前的准备
创建一个数据元类并填充数据做一个指定对象的数据集合。
class Users{private String userName;private String password;public Users(String userName, String password) {this.userName userName;this.password password;}public String getUserName() {return userName;}Overridepublic String toString() {return Users{ userName userName \ , password password \ };}
}测试数据集合如下
ListUsers users Arrays.asList(new Users(xj5, 555), new Users(xj2, 2222), new Users(xj1, 1111), new Users(xj3, 3333));正序排序
Stream中的排序通常会使用到其中的sort()方法接下来就按步骤进行数据排序操作。
1、数据集合的判空 Optional.isPresent()
从数据库等其他方式获取到的数据并非就一定存在。虽然在本次定义了测试数据集合但为了代码逻辑的健壮性则需要经过如下操作处理。
System.out.println(----- Optional.ofNullable(null).isPresent());
System.out.println(----- Optional.ofNullable(new ArrayList()).isPresent());执行后的结果
----- false
----- true所以上面的数据集合可以进行下列操作。
Optional.ofNullable(users).orElse(new ArrayListUsers())当然也可以通过Optional.ofNullable(集合别名).isPresent()判断集合是否存在再通过返回 boolean 判断是否继续向下执行链式编程代码。
2、使用sort排序
使用sort排序时如果其中是对象则还需要使用一个Comparator.comparing()的方法转换。
Optional.ofNullable(users).orElse(new ArrayListUsers()).stream().sorted(Comparator.comparing(Users::getUserName))3、将排序后的数据流转换为list
ListUsers collect Optional.ofNullable(users).orElse(new ArrayListUsers()).stream().sorted(Comparator.comparing(Users::getUserName)).collect(Collectors.toList());执行后日志输出如下信息
[Users{userNamexj1, password1111},Users{userNamexj2, password2222}, Users{userNamexj3, password3333}, Users{userNamexj5, password555}]你以为这样就完了
Optional.ofNullable只是判断传递的参数是否为null如果传递的参数是对象则还需要注意对象中的每个属性的数据是否为null。
看一个反例如果其中某个对象的值是null时会出现什么样的情况
package xj.test.streams;import java.util.*;
import java.util.stream.Collectors;public class Test6 {public static void main(String[] args) {ListUsers users Arrays.asList(new Users(xj5, 555), new Users(xj2, 2222), new Users(xj1, 1111), new Users(xj3, 3333), new Users(null,null));ListUsers collect Optional.ofNullable(users).orElse(new ArrayListUsers()).stream().sorted(Comparator.comparing(Users::getUserName)).collect(Collectors.toList());System.out.println(collect);}
}此处出现空指针的问题在于Comparator.comparing中的数据元存在空的问题报错
解决方式也很简单将需要排序的字段在sort操作之前可以进行一次过滤如下
public class Test6 {public static void main(String[] args) {ListUsers users Arrays.asList(new Users(xj5, 555), new Users(xj2, 2222), new Users(xj1, 1111), new Users(xj3, 3333), new Users(null,null));ListUsers collect Optional.ofNullable(users).orElse(new ArrayListUsers()).stream().filter(x-Objects.nonNull(x) x.getUserName() ! null).sorted(Comparator.comparing(Users::getUserName)).collect(Collectors.toList());System.out.println(collect);}
}成功解决
倒序排序
倒序排序操作并不是很复杂只需要在排序的Comparator.comparing(Users::getUserName)后将结果使用reversed()反转一下就可以实现。如下所示
public class Test6 {public static void main(String[] args) {ListUsers users Arrays.asList(new Users(xj5, 555), new Users(xj2, 2222), new Users(xj1, 1111), new Users(xj3, 3333), new Users(null,null));ListUsers collect Optional.ofNullable(users).orElse(new ArrayListUsers()).stream().filter(x-Objects.nonNull(x) x.getUserName() ! null).sorted(Comparator.comparing(Users::getUserName).reversed()).collect(Collectors.toList());System.out.println(collect);}
}