Filter 在Java8中检查列表是否为空

Filter 在Java8中检查列表是否为空,filter,java-8,java-stream,empty-list,Filter,Java 8,Java Stream,Empty List,我是Java8新手。我已经实现了列表和过滤器。我在代码中做了空检查。如果您能帮助我检查同一代码段中的列表是否为空,我将不胜感激。如果列表不是空的,那么代码应该继续断言 list.stream().filter(listElement -> listElement != null). forEach((listElement) -> Assert.assertEquals( ValueType.CANDY, listElement.get

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

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

查看
isEmpty
方法

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

以下是文档:

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

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

assertThat(list.isEmpty(), not(equalTo(Boolean.FALSE)))
。。。或者类似的东西


关于空列表的一个要点是,它们的处理方式与包含元素的列表相同。这就是为什么像和这样的东西存在。因此,如果你真的关心列表是空的,你真的应该把它作为一个单独的、不同的断言。

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

    list.stream().filter(listElement -> listElement != null).
    forEach((listElement) -> Assert.assertEquals(
        ValueType.CANDY,
        listElement.getCandyType()));
不过,您可以简化代码:

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

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

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

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

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

因为此表单保证在关闭断言时不会有开销,而第一个变体,具有带有
forEach
操作的
assert
语句,仍然可能导致迭代所有元素并执行管道的中间步骤。

选择的答案很好,只是一个小建议,可以使用
Optional.ofNullable
处理空情况:


谢谢,但我想知道如何在Java8流中检查它的语法如果列表是空的,那么断言无论如何都不会发生,因为如果这些实用程序方法按照其名称执行,
not(equalTo(Boolean.FALSE))就不会有任何元素循环
是说
true
..@Holger的一种相当模糊的方式,我想他们也能够自动格式化错误消息(比如“它不等于FALSE”)。虽然这样的冗长在这里是绝对不必要的。@霍尔格你是对的,最好的断言可能会使用hamcrest
IsEmptyCollection.empty()
matcher-
assertThat(list,not(empty())
。这种方法的缺点是,如果失败,原始代码将显示一个实际的不匹配值,如“我期待着糖果,但结果是:SHMANDY“虽然您的代码只是说断言失败了。@塔吉尔·瓦列夫:我的第一个变体仍然这样做。尽管这些信息是否真的有用还有争议。也许索引会更有用,也许其他不匹配的项,如果有的话……通常,导致错误状态的历史记录是您所需要的,但这是两种变体都无法提供的。谢谢。我选择了您的答案。它非常清楚,并且改进了我的代码。
  Optional.ofNullable(list)
            .orElseGet(Collections::emptyList)
            .stream().filter(Objects::nonNull)
            .map(listElement -> listElement.getCandyType())
            .forEach(candyType -> Assert.assertEquals(ValueType.CANDY, candyType)););