我知道我可以过滤流以仅获取不为null的那些元素,然后根据需要对其进行处理。像这样:
myList.stream().filter(element -> element != null).doOtherThings...
是否有一种方法可以断言流函数中的元素不为null,以便遍历所有元素,如果发现一个元素为null,则抛出异常?我一直在想以下内容:
myList.stream().assert(Objects::nonNull).doOtherThings...
答案 0 :(得分:8)
使用类似
.map(Objects::requireNonNull)
您只需要应用将引发异常的操作,否则将参数传递给其他人。
尽管,除非有充分的理由不重复访问列表,否则将检查和处理分开可能会更清楚:
if (myList.stream().anyMatch(Objects::isNull)) {
throw ...
}
// Do things with list.
答案 1 :(得分:3)
对于map方法,我更喜欢使用peek方法。我认为它比必须返回一些值的uing map方法更具表现力。
list.stream()
.peek(Objects::requireNonNull)
但是我认为很难理解的是,直到调用collect()才执行流。这就是为什么很难使用流来执行这种条件逻辑的原因。老实说,如果您想获得理想的效果,则必须执行以下操作。
list.stream()
.peek(Objects::requireNonNull)
.collect(Collectors.toList())
.stream()
.map(t -> do whatever ... )
答案 2 :(得分:2)
已经有一些非常好的建议。请允许我补充。如果您所追求的是一个CMake Warning at CMakeLists.txt:15 (find_package):
Could not find a configuration file for package "Qt5Core" that is
compatible with requested version "5.10".
The following configuration files were considered but not accepted:
C:/some/where/lib/cmake/Qt5Core/Qt5CoreConfig.cmake, version: 5.9.4
语句中的断言,我想在代码中明确声明此内容,以引导读者了解我的目的。要断言原始列表不包含任何assert
,请执行以下操作:
null
如果要在流管道的某处检查断言,则简单的方法是:
assert ! myList.contains(null);
如果您不想为断言创建单独的流,而是希望在现有流管道的中间进行断言,请使用以下示例:
assert myList.stream().map(this::transform).allMatch(Objects::nonNull);
您可能会担心 myList.stream()
.peek(e -> { assert e != null; })
.toArray();
的使用不太好,这也是为什么我最后提到此选项的原因。 peek
被记录为“主要是为了支持调试”而存在(引用不包含在上下文中),因此您可以说它与peek
的目的有关,因此在这种情况下捍卫了它的使用。 / p>