流中的断言

时间:2018-11-16 10:03:54

标签: java java-stream assertion

我知道我可以过滤流以仅获取不为null的那些元素,然后根据需要对其进行处理。像这样:

myList.stream().filter(element -> element != null).doOtherThings...

是否有一种方法可以断言流函数中的元素不为null,以便遍历所有元素,如果发现一个元素为null,则抛出异常?我一直在想以下内容:

myList.stream().assert(Objects::nonNull).doOtherThings...

3 个答案:

答案 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>