JAVA中使用Stream流对List进行操作-常用方法和坑
Stream常见操作方法
1. 按照条件查找指定数据, 找到返回一个对象, 找不到返回null
User user =getUsers().stream().filter(p -> p.getId()==6).findAny().orElse(null);
System.out.println(user != null ? user.toString():
2.按找条件筛选数据, 返回一个List集合
List<User> users =getUsers().stream().filter(p -> p.getAge()>20).collect(Collectors.toList());
System.out.println(users);
PS: 根据数据筛选的时候, 如果age中出现null数据, 就会报空异常, 而由于是Lambda表达式内部, 所以调试不会定位问题在哪里, 基本定位方法, 方法没错, 传入没错, 那就是数据出错了
3、对BigDecimal类型数据进?求和
BigDecimal totalMoney = users.stream().filter(p -> p.getMoney()!= null).map(User::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
System.out.println(totalMoney);
4、按条件统计数量
long count =getUsers().stream().filter(p -> p.getName()!= null).count();
System.out.println(count);
5、按条件对数据进?求和
double totalAge =getUsers().stream().filter(p -> p.getName()!= null).mapToDouble(User::getAge).sum();
System.out.println(Math.ceil(totalAge / count));
6、按条件对数据进?分组
Map<Integer, List<User>> userMap =getUsers().stream().collect(Collectors.groupingBy(User::getAge));
System.out.println(userMap);
7、List泛型集合按id分组,获取id分组之后最?值
List<Fog> result =new ArrayList<>();
fogs.stream().collect(Collectors.groupingBy(Fog::getStationId)).forEach((key, values)->{
values.stream().min(Comparator.comparing(Fog::getValue)).ifPresent(fog -> result.add(toFog(key, fog.getValue())));
});
8、List泛型集合按id分组,获取id分组之后最?值
List<WindExtreme> result =new ArrayList<>();
windExtremes.stream().collect(Collectors.groupingBy(WindExtreme::getStationId)).forEach((key,values)->{
values.stream().max(Comparator.comparing(WindExtreme::getSpeed)).ifPresent(windExtreme -> result.add(toWindExtreme(key, windExtreme.getSpeed())));
});
|