【问题标题】:How to perform null check in java 8如何在 java 8 中执行空检查
【发布时间】:2020-03-11 18:33:48
【问题描述】:

如何在java 8中编写以下代码

List<String> names = service.serviceCall();

if(names != null) { // **how to do this null check with java 8**
    names.forEach(System.out::println);
}

【问题讨论】:

  • if(names != null) { … } 正是我们在 Java 8 中这样做的方式。除非我们设法说服serviceCall() 的作者停止为集合类型返回null...
  • if 语句尚未被弃用。
  • 这是正确的,但尽量避免传入空值作为检查。使用下面提供的答案。 Optional 是 java 8 的一个不错的特性,我更喜欢上面的

标签: java foreach java-stream


【解决方案1】:

你可以这样做:

Optional.ofNullable(names).orElse(Collections.emptyList()).forEach(System.out::println);

Optional.ofNullable(names).ifPresent(n -> n.forEach(System.out::println));

Stream.of(names)
    .filter(Objects::nonNull)
    .flatMap(Collection::stream)
    .forEach(System.out::println);

但不要。看看你必须写的所有额外的东西。

只需使用普通的旧空检查,就像您在代码中已经使用的那样。

【讨论】:

    【解决方案2】:

    正如Answer by Andy Turner 建议的那样,最好在这里编写一个简单的空检查。

    Objects.nonNull

    但 Java 8 确实提供了一个小改进:Objects 实用程序类上的方法用于空值检查。

    所以你的代码会这样。

    List<String> names = service.serviceCall();
    
    if( Objects.nonNull( names ) ) 
    {   
        names.forEach( System.out::println );
    }
    

    Objects.requireNonNullElseGet

    Objects 上的另一种方法可以返回一个替代对象,如果这适合您的情况。例如,如果您的服务调用返回空列表,也许您应该替换一个空列表。致电Objects.requireNonNullElseGet

    传递的 lambda 以惰性方式处理,除非需要,否则不会执行。

    List<String> names = 
            Objects.requireNonNullElseGet
            ( 
                service.serviceCall() , 
                () -> new ArrayList<>( 0 )  // In Java 9 and later, use `List.of()`.
            )
    ;
    names.forEach( System.out::println );
    

    【讨论】:

    • “但是 Java 8 确实提供了一个小的改进:Objects 实用程序类上用于空检查的方法。”这些方法并非旨在取代空检查。它们的存在只是为了给你一个在方法链中使用的方法引用,例如filter(Objects::nonNull)。在可能的情况下,最好使用普通的旧空检查。
    • @AndyTurner 为什么不能在其他上下文中使用Objects 方法?像Objects.nonNull 这样的调用比!= null 的旧语法更易于阅读且不易出错。正如我在上一个示例中所看到的,在接收到 null 的情况下使用Objects.requireNonNull 提供替代对象是紧凑且自记录的。你的评论让我很困惑。
    • 也许你喜欢尤达条件;我认为“objects non null thing”比“thing is not null”读起来更自然。各有各的。但我指的是明确指出预期用途的 Javadoc;人们必须质疑为什么 API 设计人员要付出额外的努力才能这么说。我也不觉得它更容易出错:我有时会错误地反转条件,但我认为这与== vs !=isNull vs nonNull 没有任何关系。此外,您还有一个无意的原始参数的额外错误可能性。
    • @AndyTurner 关于“明确调用预期用途的 Javadoc”,我在 the Javadoc 中找不到这个。请引用。
    • 它是方法上的@apiNote,在您链接的页面中:“此方法存在用作谓词,filter(Objects::isNull)”,“此方法存在用于使用作为谓词,filter(Objects::nonNull)".
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多