问题:开发时遇到一个问题,对象集合中所有对象的某个同一属性全是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<Object> arrayList = new ArrayList<>();
arrayList.add(null);
arrayList.add(null);
arrayList.add(null);
System.out.println("arrayList = " + arrayList);//arrayList = [null, null, null]
/**
* 日常开发中,总会判断集合不为空,然后再走业务逻辑。
* 如果集合中都是空元素,导致集合不为空,走了业务逻辑。我们的本意是空元素不想走业务逻辑得,下面这样写会导致很严重错误。
*/
List<Object> collect = arrayList.stream().distinct().collect(Collectors.toList());
System.out.println("collect = " + collect);//collect = [null]
if (!CollectionUtils.isEmpty(collect)) {
// 业务逻辑
}
/**
* 严谨写法 不会走进业务逻辑
*/
List<Object> collect1 = arrayList.stream().filter(Objects::nonNull).distinct().collect(Collectors.toList());
System.out.println("collect1 = " + collect1);//collect1 = []
if (!CollectionUtils.isEmpty(collect1)) {
// 业务逻辑
}
}
}