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

时间:2015-12-22 23:21:24

标签: filter java-8 java-stream empty-list

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

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

4 个答案:

答案 0 :(得分:19)

你问的是一个过时的问题。 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形式的方法引用;我没有在这里做,因为我不知道正确的班级名称。

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

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

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

因为这种形式保证断言断言时不会有开销,而第一个变量,assert语句带有forEach动作可能仍会导致遍历所有元素并执行管道的中间步骤。

答案 1 :(得分:12)

选择的答案很棒,只是一个小问题,可以使用newly introduced to Java8 Optional classOptional.ofNullable处理空案例:

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

答案 2 :(得分:7)

查看isEmpty方法

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

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

答案 3 :(得分:1)

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

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

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

......或类似的东西。

关于空列表的一个主要观点是,它们的处理方式与包含元素的列表相同。这就是Optional classNull pattern之类的东西存在的原因。因此,如果您真的关心列表是空的,那么使其成为一个单独的,不同的断言。