02_List.size为1但是内容为null处理方法
...大约 2 分钟
今天写代码遇到一个很奇怪的问题,那就是我使用SQL查询的结果为null,当把结果用一个list接收的时候,list.size() = 1,然后内部处理的时候出现了NPE,可我明明已经做了非空校验啊 然后百思不得其解,先使用了一个较笨的方案。。。
if (!list.isEmpty()) {
if (list.get(0) != null) {
//todo
}
}
但是这种方式,不太靠谱,为什么呢?因为如果你的list中包含多个数据,而你不知道他给了你的null的数据,毕竟list.add(null)可以有多次执行的,list.size()也会逐渐提升。
那到底是出现了什么问题呢?难道是查询的问题?于是乎我做了这么一个实验。
第一步:执行SQL
可以看出没有任何结果。然后根据左连接的特性,查询左表的所有数据和右表的匹配的数据。
然后猜想,是不是因为一个巧合,这是一条非空的数据,只是恰巧我要查询的都是空的呢? 然后我补齐查询,再试一次。 可以看出还真是这样,然后对于我们来说,这条数据是空的,也仅仅是因为我们要查询的字段是空的,但是其他数据都不是空的,所以他把这个数据数据库并没有当作一条空数据来看,还是映射给了我们的对象,导致List的内部有一个空对象,因为list内部是可以支持null的,所以以后在遇到这种问题,先从源头考虑,上面的java代码,纯属搞笑。 但是这种方式还有问题,你不知道这个集合里面到底有多有条null,那我们怎么办呢?还有一招究极解决办法,我们可以使用java8的Stream流达到直接解决达到目的:
list.parallelStream().filter(Objects::nonNull).collect(Collectors.toList())
最后要讲的一点就是,每一个结果的出现都不是偶然,一定是有自己的含义的,我们不能凭借自己的想象来解决问题。
Powered by Waline v2.15.8