在项目开发中,我们经常会遇到在for循环中遍历获取条件,来循环访问数据库查询数据的场景。这种做法虽然对开发人员来说很省事,但是循环操作数据库,会给数据库带来很大压力。而且整个接口跑下来耗时还很长,为了避免出现这种频繁操作数据库的现象,目的减轻数据库压力,我们可以采用JDK1.8的新特性stream流,把我们需要的数据一次性从数据库中查出,然后在程序中对数据进行处理。下面我模拟开发中的场景,使用stream新特性进行数据处理。
@Getter
@Setter
@ToString
public class User implements Serializable {
private Long userId;//人员id
private String userName;//姓名
private Integer userAge;//年龄
private String userSex;//性别
private String className;//班级名
public User() {
}
public User(Long userId, String userName, Integer userAge, String userSex, String className) {
this.userId = userId;
this.userName = userName;
this.userAge = userAge;
this.userSex = userSex;
this.className = className;
}
}
/*初始化一个User集合,并赋值*/
List<User> userList = new ArrayList<User>(){
{
this.add(new User(1L,"小明",5,"男","一年级"));
this.add(new User(2L,"小红",5,"女","一年级"));
this.add(new User(3L,"小亮",6,"男","二年级"));
this.add(new User(4L,"小高",6,"女","二年级"));
this.add(new User(5L,"小志",6,null,"二年级"));
}
};
/*以年级 className 进行分组转 map */
Map<String,List<User>> userMap = userList.stream().collect(
Collectors.groupingBy(User::getClassName));
List<User> gradeOneUserList = userMap.get("一年级");
List<User> gradeTwoUserList = userMap.get("二年级");
/*以 userId 为 key 转成 map格式*/
Map<Long,User> userMap = userList.stream().collect(
Collectors.toMap(User::getUserId, Function.identity(), (key1, key2) -> key2));
User user = userMap.get(1L);//小明
/*以 userId 为 key ,className 为 value 把 User 集合转成 map 格式*/
/*注意,用来当做key的属性要保证在集合中是惟一的,最好采用主键。如果存在className为null的数据,本次转换会报NullPointerException空指针异常,感兴趣的小伙伴可以去查看源码,查找原因*/
Map<Long,String> userMap = userList.stream().collect(
Collectors.toMap(User::getUserId, User::getClassName));
String className = userMap.get(1L);//小明的年级
/*获取所有学生的名字集合*/
List<String> userNameList = userList.stream().map(
User -> User.getClassName()).collect(Collectors.toList());
/*判断是否有,名字叫作“迪丽热巴”或者 “迪丽冷巴”的学生*/
boolean bool = userList.stream().anyMatch(
User -> "迪丽热巴".equals(User.getUserName()) || "迪丽冷巴".equals(User.getUserName()));
/*过滤掉性别为 null 的数据*/
List<User> userAgeIsNotNullList = userList.stream().filter(
User -> User.getUserSex() != null).collect(Collectors.toList());
/*分别求一年级和二年级学生的年龄的总和*/
/*注意,如果存在 userAge 为 null 的数据,本次转换会报NullPointerException空指针异常*/
Map<String,Integer> sumAgeGroupByClassNameMap = userList.stream().collect(
Collectors.groupingBy(User::getClassName,Collectors.summingInt(User::getUserAge)));
Integer gradeOneSumAge = sumAgeGroupByClassNameMap.get("一年级");//一年级学生的年龄总和
/*去重,去除重复的水果名*/
List<String> fruitNameList = new ArrayList<String>(){
{
this.add("荔枝");
this.add("荔枝");
this.add("葡萄");
this.add("苹果");
}
};
List<String> distinctFruitNameList = fruitNameList.stream().distinct()
.collect(Collectors.toList());
distinctFruitNameList.stream().forEach(element->{
System.out.println(element);
});