Java 8在对象的属性上传输nonNull

Luc*_*che 4 java filter java-8 java-stream

我有以下代码片段,它收集具有name包含特定过滤器的字符串属性的特定对象filterName.

List<Foo> filteredFoo= fooList.stream()
                .filter(Objects::nonNull)
                .filter(myFoo -> {
                            if (Strings.isNullOrEmpty(myFoo.getName()))
                                return false;
                            return myFoo.getName().contains(filterName);
                        }
                ).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

它按预期工作,但我想知道是否有更优雅的方式以if-statement函数方式编写并以比在过滤器中具有条件块更好的方式检查空或null属性.

Ser*_*tin 7

替换filter为以下内容:

.filter(myFoo -> Optional.ofNullable(myFoo.getName())
                         .filter(n -> n.contains(filterName))
                         .isPresent())
Run Code Online (Sandbox Code Playgroud)

甚至:

.filter(myFoo -> {
    String name = myFoo.getName();
    return name != null && name.contains(filterName)
 })
Run Code Online (Sandbox Code Playgroud)

  • 它是否为空无关紧要.空字符串不包含`filterName`,无论如何你都要检查它.另外`!n.isEmpty()`会更简洁. (4认同)
  • 仍然,`!Strings.isNullOrEmpty(name)&& name.contains(filterName)`是不必要的冗长.除非您想不惜一切代价向项目添加第三方库需求,否则您可以简单地说`name!= null && name.contains(filterName)`.正如@zeroflagL已经指出的那样,暗示的`isEmpty()`检查是过时的,你不需要一个实用的方法来进行简单的`...!= null`检查. (3认同)