检查列表中是否至少包含一个非空对象。

5

有没有一种方法可以检查List不为空并且有一个非空对象?

以下代码是否有更好的替代方案?

if( !list.isEmpty() && list.get(0) != null){
    ...
}

请告诉我这段代码是否有改进的余地。


我认为你不需要第二部分的' && list.get(0) != null',因为isEmpty()方法已经处理了这个问题。此外,list.get(0)可能为空,而list.get(1)不为空,因此根据你的标准,它并没有增加价值。 - mba12
@mba12 我只关心第一个对象不为空。 - codeMan
1
如果是这种情况,你应该编辑你的问题以反映只有第一个对象不为空的标准。 - mba12
我已经编辑了这个问题。 - codeMan
2个回答

9
我猜你可以尝试使用Java 8。
if (list.stream().anyMatch(e -> e != null)) {... }

16
或者 anyMatch(Objects::nonNull) 的意思是检查一个流中是否存在非空元素。 - tobias_k
@tobias_k 这是最好的答案! - Nikolas

2
你的代码无法正常工作。如果null元素是第二个或第三个会发生什么?
一种简单的方法是使用contains方法:

如果此列表包含指定的元素,则返回true。更正式地说,仅当此列表包含至少一个元素e(o==null ? e==null : o.equals(e))时才返回true。

如果你需要检查是否恰好存在一个非空元素,这里是你需要编写的代码:
int countNull = 0;
for (Object obj : list) {
    if (obj == null) {
        countNull++;
    }
}
if (countNull == list.size() - 1) {
    // Contains exactly one not null element
}

我想检查是否只存在一个非空对象。 - codeMan
不,OP想要检查是否至少有一个非空元素。 - tobias_k
@codeMan 你是什么意思?你想检查是否只有一个非空元素吗?如果是这样,请更新你的问题标题。 - tobias_k
@codeMan 谢谢。我编辑了我的答案(第二部分),展示如何查看列表是否恰好包含一个非空元素。 - Davide Lorenzo MARINO
List.contains方法也可能会抛出NPE(取决于列表的实现方式),因此调用contains(null)实际上可能会有问题。 尤其是自从List.of(..)创建了其中一个实现方式,实际上会抛出上述NPE异常。 - ThomasE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接