你在问一个过时的问题。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
遵循此检查所需的规则。如果没有元素,则没有矛盾的元素,因此全部 match。请注意,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
仍可能导致迭代所有元素并执行管道的中间步骤。