检查 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 class 的 Optional.ofNullable
的 null 大小写:
Optional.ofNullable(list)
.orElseGet(Collections::emptyList)
.stream().filter(Objects::nonNull)
.map(listElement -> listElement.getCandyType())
.forEach(candyType -> Assert.assertEquals(ValueType.CANDY, candyType)););
我是 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 class 的 Optional.ofNullable
的 null 大小写:
Optional.ofNullable(list)
.orElseGet(Collections::emptyList)
.stream().filter(Objects::nonNull)
.map(listElement -> listElement.getCandyType())
.forEach(candyType -> Assert.assertEquals(ValueType.CANDY, candyType)););