Java8的Optional

简介

Optional是Java 8中为了处理空指针异常而新增的类,同时这个类也提供了很多支持lambda表达式的方法。下面我会通过几个例子向大家展示如何使用Optional

实战

初始化

Optional提供3个方法用于初始化Optional对象:

  1. Option.empty()
  2. Optional.ofNullable()
  3. Optional.of()
示例
//构建一个空的Optional
Optional<String> empty=Optional.empty();
String str="hello";
//构建一个值不能为Null的Optional的对象
Optional<String> optionalStr=Optional.of(str);
//构建一个空的Optional对象
Optional<String> optionalNull=Optional.ofNullable(null);
//输出empty对象
System.out.println(empty);
//判断empty对象是否单例模式
System.out.println(empty.equals(optionalNull));
//输出带有值的Optional对象
System.out.println(optionalStr);
输出结果
Optional.empty
true
Optional[hello]
注意事项
  1. Optional.of()不允许构建值为null的对象,入参为null,如Optional.of(null)时会直接抛出NullPointerException
  2. Optional.ofNullable(null)等价于Option.empty(),两者返回的是同一个对象

Optional如何处理空指针

Optional提供了isPresent()判断Optional的值是否为null,但是使用这个方法并未很好使用到Optional处理空指针的优势。下面展示如何使用Optional优雅地处理空指针。

示例
//构建随机树对象
Random random=new Random();
//获取随机数
Integer i=random.nextInt(100);
//构建Optional对象,当随机数小于30,则构建empty对象
Optional<Integer> optionalInt=Optional.ofNullable(i>=30?i:null);
//Optional对象的值不为null,则输出值
optionalInt.ifPresent(integer -> {
    System.out.println(integer);
});
//当Optional对象的值为null时返回默认值0
System.out.println(optionalInt.orElse(0));
//当Optional对象的值为null时抛出一个RuntimeException
optionalInt.orElseThrow(()->new RuntimeException());

由于这段代码执行结果存在随机性,所以不展示输出结果,有兴趣的朋友可以复制这段代码执行一下。

注意事项
  1. 值为nullOptional对象调用get()方法时会抛出NoSuchElementException

orElse和orElseGet的区别

Optional中有2个类似的方法:orElse()orElseGet()。两者的区别下面我会通过一个例子展示

示例
public class User{

    public User() {
        //通过输出内容判断构造方法是否被调用
        System.out.println("User init");
    }
}
//构建一个值不为null的Optional对象
Optional<User> uer=Optional.of(new User());
System.out.println("use orElse");
uer.orElse(new User());
System.out.println("use orElseGet");
uer.orElseGet(()->new User());
输出结果
User init
use orElse
User init
use orElseGet
分析

从输出结果可以看出当值不为nullOptional对象调用orElse()方法时会调用构造方法,而调用orElseGet()时则不会调用构造方法。

过滤和类型转换

Optional中也提供了filter()map()flatMap()方法对Optional的值进行过滤和类型转换操作

示例
//构建随机树对象
Random random=new Random();
//构建Optional对象
Optional<Integer> optionalInt=Optional.of(random.nextInt(100));
//过滤出大于0的值,
System.out.println(optionalInt.filter(integer->integer>0));
//将Integer转成Double
System.out.println(optionalInt.map(integer -> Double.valueOf(integer)));
//将值为Integer的Optional对象转成值为Double的Optional对象
System.out.println(optionalInt.flatMap(integer -> Optional.ofNullable(Double.valueOf(integer))));

由于这段代码执行结果存在随机性,所以不展示输出结果,有兴趣的朋友可以复制这段代码执行一下。

注意事项
  1. filter()方法如果值不满足过滤条件时,返回值为Optional.empty()对象

拓展

Optional提供了3个和数值有关的功能拓展类OptionalDoubleOptionalIntOptionalLong

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 8引入了Optional类,它是一个容器对象,可以包含或者不包含非空值。Optional类主要用于解决空指针异常的问题,它提供了一种优雅的方式来处理可能为空的值。 下面是Java 8 Optional的使用方式: 1. 创建Optional对象: - 使用静态方法`Optional.of(value)`创建一个包含非空值的Optional对象。 - 使用静态方法`Optional.empty()`创建一个空的Optional对象。 - 使用静态方法`Optional.ofNullable(value)`创建一个包含可能为空值的Optional对象。 2. 判断Optional对象是否包含值: - 使用`isPresent()`方法判断Optional对象是否包含非空值。 - 使用`isEmpty()`方法判断Optional对象是否为空。 3. 获取Optional对象的值: - 使用`get()`方法获取Optional对象中的值。注意:如果Optional对象为空,调用`get()`方法会抛出NoSuchElementException异常。 4. 处理Optional对象的值: - 使用`ifPresent(Consumer<? super T> consumer)`方法,传入一个Consumer函数式接口来处理Optional对象中的值。如果Optional对象非空,则执行传入的Consumer接口中的逻辑。 - 使用`orElse(T other)`方法,如果Optional对象为空,则返回传入的默认值other。 - 使用`orElseGet(Supplier<? extends T> other)`方法,如果Optional对象为空,则通过传入的Supplier函数式接口生成一个默认值。 - 使用`orElseThrow(Supplier<? extends X> exceptionSupplier)`方法,如果Optional对象为空,则通过传入的Supplier函数式接口抛出一个异常。 5. 使用Optional进行链式调用: - 使用`map(Function<? super T, ? extends U> mapper)`方法,传入一个Function函数式接口来对Optional对象中的值进行换。 - 使用`flatMap(Function<? super T, Optional<U>> mapper)`方法,传入一个Function函数式接口来对Optional对象中的值进行换,并返回一个新的Optional对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值