Java 8 新特性 Optional:消除空指针异常

图片[1]-Java 8 新特性 Optional:消除空指针异常-山海云端论坛

一、什么是空指针异常?

空指针异常(Null Pointer Exception,NPE)是 Java 中最常见的异常之一。尽管其原因显而易见,但开发人员经常忽略或未能及时采取措施,这可能导致程序崩溃或产生不可预测的行为。

二、空指针场景

为了避免 NPE,程序员应该注意以下场景:

  • 返回类型为基本数据类型时,如果返回的是包装数据类型的对象,自动拆箱有可能产生 NPE;
  • 当对象为空时调用方法,比如 Object.getProperty()
  • 集合中的元素为空,即使使用了 CollectionUtils.isNotEmpty() 判空,取出的数据元素也有可能为 null;
  • 级联调用时,如果其中一个对象为空,会抛出空指针异常;
  • RPC 远程调用返回的数据对象为空。

三、Optional概述

Optional 是 Java 8 中引入的类,用于描述值存在或不存在的情况。它可以存储任意类型的值,或表示空值。使用 Optional 类可以避免传递和检查 null 值,提高代码的健壮性和可读性。

四、Optional常用属性

基本使用方式如下:

<code>Optional.ofNullable(需要判断的对象).ifPresent(具体操作)</code>

4.1 检查Optional是否有值

  • empty(): 返回一个空的 Optional 实例;
  • of(T value): 创建一个包含非 null 值的 Optional 对象;
  • ofNullable(T value): 创建一个包含指定值的 Optional 对象,允许值为 null;
  • get(): 获取 Optional 对象中的值,可能抛出 NoSuchElementException 异常;
  • isPresent(): 判断 Optional 对象是否有值。

4.2 Optional的链式调用

通过 map()flatMap()filter() 方法进行链式调用,对 Optional 的值进行操作。

4.3 orElse默认操作

  • orElse(T other): 如果 Optional 对象不包含值,则返回指定的默认值;
  • orElseGet(Supplier<? extends T> other): 如果 Optional 对象不包含值,则返回由指定的 Supplier 生成的默认值;
  • orElseThrow(Supplier<? extends X> exceptionSupplier): 如果 Optional 对象不包含值,则抛出由指定的 Supplier 产生的异常。

五、Optional的优点和应用场景

  • 避免空指针异常;
  • 优雅的代码处理;
  • 显式地指出变量可能为空;
  • 对集合的处理效率更高。

下面是几个使用 Optional 类过滤集合中的 null 值的示例。

import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

public class ListUtils {
    public static List<String> filterNullValues(List<String> list) {
        return list.stream()
                .filter(str -> str != null)
                .map(Optional::ofNullable)
                .filter(Optional::isPresent)
                .map(Optional::get)
                .collect(Collectors.toList());
    }
}

六、总结

6.1 Optional的总结

  • Optional 是 Java 8 中的新特性,用于避免空指针异常,提高代码的可读性和健壮性;
  • 使用时需要注意值是否存在,避免抛出 NoSuchElementException 异常。

6.2 Optional的发展趋势

随着函数式编程的流行和 Java 9、Java 10 的发布,Optional 类也会得到更多的应用和完善。在函数式编程中,对于空值的处理变得越来越重要,Optional 类的优势将得到更充分的发挥。

来源:https://juejin.cn/post/7300550397780164617

推荐:https://chencoding.top:8090

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容