【坑】使用lambda表达式filter(Objects::nonNull)过滤掉空元素

问题:开发时遇到一个问题,对象集合中所有对象的某个同一属性全是null,使用map()映射该属性得到的集合不为空。
原因: 在调用map()方法时,返回的是包含null值得流,如果继续使用distinct()方法会将null值视为不同的元素,导致最终结果是包含一个空元素得集合。
措施:map()后使用filter(Objects::nonNull)过滤掉空元素。

代码demo如下:

package com.demo;

import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

public class MainTest {

    public static void main(String[] args) {
        ArrayList arrayList = new ArrayList<>();
        arrayList.add(null);
        arrayList.add(null);
        arrayList.add(null);
        System.out.println("arrayList = " + arrayList);//arrayList = [null, null, null]

        /**
         * 日常开发中,总会判断集合不为空,然后再走业务逻辑。
         * 如果集合中都是空元素,导致集合不为空,走了业务逻辑。我们的本意是空元素不想走业务逻辑得,下面这样写会导致很严重错误。
         */
        List collect = arrayList.stream().distinct().collect(Collectors.toList());
        System.out.println("collect = " + collect);//collect = [null]
        if (!CollectionUtils.isEmpty(collect)) {
            // 业务逻辑
        }


        /**
         * 严谨写法 不会走进业务逻辑
         */
        List collect1 = arrayList.stream().filter(Objects::nonNull).distinct().collect(Collectors.toList());
        System.out.println("collect1 = " + collect1);//collect1 = []
        if (!CollectionUtils.isEmpty(collect1)) {
            // 业务逻辑
        }
    }
}
 
  

                            
                        
                    
                    
                    

你可能感兴趣的:(坑,java)