当前位置:  开发笔记 > 前端 > 正文

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

如何解决《检查java8中的列表是否为空》经验,为你挑选了3个好方法。

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

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

Holger.. 22

你问的是一个过时的问题.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实现的工件.

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

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

因为这种形式保证了在关闭断言时不会产生任何开销,而第一个变量,具有assertforEach动作的语句仍然可能导致迭代所有元素并执行管道的中间步骤.



1> Holger..:

你问的是一个过时的问题.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实现的工件.

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

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

因为这种形式保证了在关闭断言时不会产生任何开销,而第一个变量,具有assertforEach动作的语句仍然可能导致迭代所有元素并执行管道的中间步骤.



2> Johnny..:

所选择的答案是伟大的,只是一个小小的建议与处理空情况下Optional.ofNullable的新引入到Java8可选类:

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



3> Buddy..:

看看isEmpty方法

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

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


如果列表为空,那么无论如何都不会发生断言,因为它没有任何元素可以循环
推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有