Java 关于Java8的Optional类的理解和使用整理

简介

  • 什么是Optional

Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。
Optional 类的引入很好的解决空指针异常。

  • 为什么要使用Optional

在我们开发的过程中,有许多这样的场景,我们从某个方法中处理或者从数据库查询的时候,会得到一个null的结果集,比如去数据库查询名字叫’老司机’的用户,如果没有查到,数据库就会返回给我们一个null,但是我们有时候不想把null直接传递给前端,想默认传给前端’真英俊’,这样的操作我们就必须判断为空的操作,进行特殊处理,Optional给我们提供了很方便的方式,下面是我自己的理解和使用方式的整理,如果有错误,还请多多指教。

使用整理

1 将数据包装成Optional

Optional类中提供了静态方法:Optional.of();Optional.ofNullable();
首先来看一下他们的区别

public static void main(String[] args){
        String test = "";
        Optional<String> demo1 = Optional.of(test);
        System.out.println("of: " + demo1);
        Optional<String> demo2 = Optional.ofNullable(test);
        System.out.println("ofNullable" + demo2);
        // 下面是结果图片
    }

在这里插入图片描述

并没有什么不一样的,那是因为我们包装的对象不是null,如果是null,使用of方法就会报空指针异常,而ofNullable就不会。

 public static void main(String[] args){
        String test = null;
        Optional<String> demo2 = Optional.ofNullable(test);
        System.out.println("ofNullable" + demo2);
        Optional<String> demo1 = Optional.of(test);
        System.out.println("of: " + demo1);
        // 结果图在下面
    }

在这里插入图片描述

但实际上ofNullable()只是对of()进行了一层包装,实际上是在里面进行了一层判断,如果是空的话,就会调用另一个empty()方法进行直接返回。

在这里插入图片描述

2 获取Optional包装的值

获取Optional值的方法有很多,在这之中,包含了很多处理数据的方式,包括,如果是null的默认值,包括如果是null抛异常等。

2.1 public T orElse(T other)

orElse方法需要一个参数,如果返回的数据是null,就会返回我们填入的那个参数

 public static void main(String[] args){
        String test = "JiShaochen is a very cool boy !";
        String test2 = null;
        Optional<String> demo = Optional.of(test);
        Optional<String> demo2 = Optional.ofNullable(test2);
        String sc = demo.orElse("JiShaochen is not a very cool boy !");
        String sc2 = demo2.orElse("JiShaochen is not a very cool boy !");
        System.out.println("test is not null : " + sc);
        System.out.println("test is null : " + sc2);
        // 结果图如下:
}

在这里插入图片描述

2.2 public T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X

这个方法是在获取数据的时候,如果返回的数据是null,就会抛出异常进行处理。

public static void main(String[] args){
        String test = "JiShaochen is a very cool boy !";
        String test2 = null;
        Optional<String> demo = Optional.of(test);
        Optional<String> demo2 = Optional.ofNullable(test2);
        String sc = demo.orElseThrow(RuntimeException::new);
        System.out.println(sc);
        String sc2 = demo2.orElseThrow(RuntimeException::new);
        System.out.println(sc2);
		 // 结果图如下:
    }

在这里插入图片描述

2.3 public boolean isPresent()

这个方法是判断Optional对象是否有内容,会返回一个布尔类型的值。

    public static void main(String[] args){
        String test = "JiShaochen is a very cool boy !";
        boolean present = Optional.ofNullable(test).isPresent();
        System.out.println(present);
        // 结果图如下:
    }

在这里插入图片描述

有了这个,我们不但可以对Optional对象进行判断,也可以使用orElse方法获取默认数据,可以说是非常方便了。

2.4 public Optional filter(Predicate<? super T> predicate)

我们可以在filter中进行过滤,如果这个Optional对象中有我们需要的东西,我们就直接返回它,如果没有,我们就会返回一个空的Optional对象。

public static void main(String[] args){
        List<String> testList = new ArrayList<>();
        testList.add("aa");
        testList.add("ab");
        testList.add("Abc");
        testList.add("structure");

        Optional<List<String>> demo = Optional.ofNullable(testList);
        Optional<List<String>> result = demo.filter(s -> s.contains("aa"));
        System.out.println(result);
    }

在这里插入图片描述

2.5 public Optional map(Function<? super T, ? extends U> mapper)

甚至我们可以使用map对Optional对象进行处理,比如我们可以在里面把所有的字符串变成大写等操作。

public static void main(String[] args){
        String test = "JiShaochen is a very cool boy !";
        Optional<String> demo = Optional.of(test).map(s -> s.toUpperCase());
        System.out.println(demo);
    }

在这里插入图片描述

总结

总结差不多就这么多了,接下来如果有新的理解会继续更新的。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值