确保所有集合元素都为非空的现有实用程序方法
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);
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);