前言
这里介绍stream流对集合进行处理的一些常规写法。
这里的集合是对象集合,比例:List、List等。
这里用User作为演示,有以下属性
/**
* 序号
*/
private Integer index;
/**
* 用户ID
*/
private Long userId;
/**
* 用户名
*/
private String userName;
/**
* 部门
*/
private String department;
/**
* 部门ID
*/
private Long departmentId;
/**
* 区号
*/
private Long areaCode;
/**
* 账户余额
*/
private BigDecimal money;
判断是否存在满足条件的数据
例:判断List中,有没有名字叫jack且不在hz的用户
boolean b = userList.stream().anyMatch(e -> "jack".equals(e.getUsername()) && !"hz".equals(e.getAddress()));
抽取数据,构造List
例:抽取出List中的userId
List<Long> codeList = userList.stream().map(User::getUserId).collect(Collectors.toList());
抽取数据,构造Map
//例:抽取出 用户ID和用户名
Map<Long, String> userMap = userList.stream().collect(Collectors.toMap(User::getUserId, User::getUserName));
//例:以address为key,以实体类为value. 注意:key也就是address不可以有重复的值
Map<String, User> userMap1 = userList.stream().collect(Collectors.toMap(User::getAddress, info -> info));
//例:抽取出money小于25的用户ID和用户名
Map<Long, String> userMap2 = userList.stream().filter(c -> c.getMoney().compareTo(new BigDecimal("25")) < 0).collect(Collectors.toMap(User::getUserId, User::getUserName));
//例:根据AreaCode进行分组
Map<Long, List<User>> userMap3 = userList.stream().collect(Collectors.groupingBy(User::getAreaCode));
赋值
例:给List中的userName赋固定值
userList.stream().forEach(item -> item.setUserName("jack"));
例:给List中的index递增赋值,1,2,3…
Integer[] arr = {1};
userList.stream().peek(e -> e.setIndex(arr[0]++)).collect(Collectors.toList());
例:给List中的department、departmentId同时赋值
userList.stream().forEach(userData -> {
userData.setDepartment("研发部");
userData.setDepartmentId(10086L);
});
统计相加
例:把List中每个用户的money相加求和
BigDecimal totalMoney = userList.stream().map(User::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
过滤
例:取出List中money小于25的用户
List<User> userList2 = userList.stream().filter(item -> item.getMoney().compareTo(new BigDecimal("25")) < 0).collect(Collectors.toList());
例:取出List中userName=jack的用户,且只要一个jack
Optional<User> result = userList.stream().filter(item -> "jack".equals(item.getUsername())).collect(Collectors.toList()).stream().findFirst();
if(result.isPresent()){
//查询结果非空
User user = result.get();
//do something......
}
例:取出List中,名字叫jack或者tom的用户
List<User> collect = userList.stream().filter(item -> Arrays.asList("jack", "tom").contains(item.getUsername())).collect(Collectors.toList());
去重
例:根据userId,进行去重
List<User> userList3 = userList.stream().filter(distinctByKey(b -> b.getUserId())).collect(Collectors.toList());
private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
Map<Object, Boolean> seen = new ConcurrentHashMap<>();
return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}
分页/截取
int pageStart = 1;
int pageSize = 10;
List<User> userListPage = userList.stream().skip(pageStart).limit(pageSize).collect(Collectors.toList());