JDK 1.8 stream与collect 用于集合转map、集合筛选过滤、数组去重实例 (个人笔记)

集合转map、集合筛选过滤、数组去重

  • 前言
  • stream特性整理
    • 一、List转Map
    • 二、从一个对象集合中拆分出对象的某个属性集合
    • 三、判断一个对象集合中对象的某个属性是否等于指定值
    • 四、过滤掉一个对象集合中对象的某个属性为空的数据
    • 五、针对一个对象集合中对象的某个属性为分组,求对象的另一个属性的和
    • 六、集合去重

前言

在项目开发中,我们经常会遇到在for循环中遍历获取条件,来循环访问数据库查询数据的场景。这种做法虽然对开发人员来说很省事,但是循环操作数据库,会给数据库带来很大压力。而且整个接口跑下来耗时还很长,为了避免出现这种频繁操作数据库的现象,目的减轻数据库压力,我们可以采用JDK1.8的新特性stream流,把我们需要的数据一次性从数据库中查出,然后在程序中对数据进行处理。下面我模拟开发中的场景,使用stream新特性进行数据处理。

stream特性整理

一、List转Map

  • 创建User实体类
@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集合,并赋值
 /*初始化一个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为一年级和二年级的User集合
	 /*以年级 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把User集合转成Map格式

 	/*以 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格式

	/*以 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 的数据

 	/*过滤掉性别为 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);
    });

JDK 1.8 stream与collect 用于集合转map、集合筛选过滤、数组去重实例 (个人笔记)_第1张图片

你可能感兴趣的:(笔记)