确保所有集合元素都为非空的现有实用程序方法

Existing utility method to ensure that all collection elements are non null

Java8 标准库或 Guava 中是否存在现有的实用方法确保集合不为空且每个元素(如果有)不为空?

Objects.requireNonNull() 的 "collection-version"。

到目前为止我找不到这样的东西。现在我写了一个简单的实用函数来完成这项工作:

public static void requireAllNonNull(final Collection<?> collection) {
    Objects.requireNonNull(collection, "Collection must not be null");
    if (collection.stream().anyMatch(Objects::isNull)) {
        throw new NullPointerException("Collection elements must not be null");
    }
}

但问题是它必须在不同的(不相关的)项目中重复。

一种替代方法是仅使用 Guava's immutable collections,它根本不允许 null 值,但有时集合来自其他来源。

如果您只是想抛出 NPE,最简单的方法可能是尝试创建一个 Guava ImmutableCollection,这要求所有元素都为非空(例如 ImmutableList):

ImmutableList.copyOf(collection);

检查 空元素而言,Guava 有:

boolean allNonNull = Iterables.all(collection, Predicates.notNull());
checkArgument(allNonNull, "collection had null element");

但是由于 time-of-check/time-of-use 漏洞,您通常最好先复制到一个不可变的集合中。如果您通过遍历可变集合来检查不变量,那么总是有可能有人在您验证集合 之后更改它。

ImmutableList#copyOf 还具有额外的性能考虑,如果它已经是传入的 ImmutableList,它只是 returns 该列表以消除任何开销。

如果你想要的是 Objects.requireNonNull 你可以简单地这样做:

myCollection.forEach(Objects::requireNonNull);