检查 java 中的列表是否为空 8

Checking if a list is empty in java 8

我是 Java8 的新手。我已经实现了列表和过滤器。我在我的代码中做了空检查。对于如何检查同一代码段中的列表是否为空,我将不胜感激。如果列表不为空,则代码应继续断言。

    list.stream().filter(listElement -> listElement != null).
    forEach((listElement) -> Assert.assertEquals(
        ValueType.CANDY,
        listElement.getCandyType()));

查看 isEmpty 方法

if (list.isEmpty()) { ... }

这是文档:https://docs.oracle.com/javase/7/docs/api/java/util/List.html#isEmpty()

断言列表为空与断言列表的任何特定元素具有某种形式(即 getCandyType() == ValueType.CANDY)是两码事。试图将这两种想法联系在一起并不是正确的做事方式。

您需要做的是在 forEach 之前或之后添加第二个断言,

assertThat(list.isEmpty(), not(equalTo(Boolean.FALSE)))

...或类似的东西。

关于空列表的要点之一是它们可以像处理包含元素的列表一样处理。这就是 Optional class and the Null pattern 之类的东西存在的原因。因此,如果您真的关心列表是否为空,您确实应该 将其作为一个单独的、不同的断言。

你问的是一个过时的问题。 Streams 处理源的所有元素,因此,如果没有元素,则不会采取任何操作。因此,您不需要检查列表是否为空。

不过,您可以简化代码:

list.stream().filter(Objects::nonNull)
    .map(listElement -> listElement.getCandyType())
    .forEach(candyType -> Assert.assertEquals(ValueType.CANDY, candyType));

Assert.assertTrue(list.stream().filter(Objects::nonNull)
                      .map(listElement -> listElement.getCandyType())
                      .allMatch(Predicate.isEqual(ValueType.CANDY));

allMatch 遵循此检查所需的规则。如果没有元素,则没有矛盾的元素,因此全部匹配。请注意,listElement -> listElement.getCandyType() 也可以替换为 ClassName::getCandyType 形式的方法引用;我没有在这里做,因为我不知道正确的 class 名称。

两种变体之间没有性能差异。 allMatch遇到第一个不匹配的元素会立即return,assertEquals会在第一个不匹配的元素上抛出。在第二种情况下,堆栈跟踪不会显示流 API 实现的工件。

当您为生产代码而不是单元测试提供检查并允许关闭这些检查时,第二个是首选,就像 Java 语言 assert 功能一样,例如

assert list.stream().filter(Objects::nonNull)
           .map(listElement -> listElement.getCandyType())
           .allMatch(Predicate.isEqual(ValueType.CANDY));

因为这种形式保证在关闭断言时不会有开销,而第一个变体,具有带有 forEach 操作的 assert 语句可能仍然会导致遍历所有元素和执行流水线的中间步骤。

选择的答案很好,只是一个小建议来处理 newly introduced to Java8 Optional classOptional.ofNullable 的 null 大小写:

  Optional.ofNullable(list)
            .orElseGet(Collections::emptyList)
            .stream().filter(Objects::nonNull)
            .map(listElement -> listElement.getCandyType())
            .forEach(candyType -> Assert.assertEquals(ValueType.CANDY, candyType)););