【知识点】Optional 的使用 --- 避免 NPE 的利器


一、概述

Java8 引入 Optional 的目的是解决 NPE 问题,即 NullPointerExceptions ,空指针异常。
Optional 实际上是个容器:它可以保存类型 T 的值,或者仅仅保存 null。Optional 提供很多有用的方法,这样我们就不用显式进行空值检测。

Optional 在源码中的声明

public final class Optional<T> {}

二、常用方法

序号方法描述
1T get()如果在这个Optional中包含这个值,返回值,否则抛出异常:NoSuchElementException
2boolean isPresent()如果值存在则方法会返回true,否则返回 false
3void ifPresent(Consumer<? super T> consumer)如果值存在则使用该值调用 consumer , 否则不做任何事情
4static Optional of(T value)返回一个指定非null值的Optional
5static Optional ofNullable(T value)如果为非空,返回 Optional 描述的指定值,否则返回空的 Optional
6T orElse(T other)如果存在该值,返回值, 否则返回 other

三、常用方法举例

package com.wxw.multiThread;

import java.util.Optional;

public class ThreadTest {

    public static void main(String args[]){

        ThreadTest java8Tester = new ThreadTest();
        Integer value1 = null;
        Integer value2 = new Integer(10);

        // Optional.ofNullable - 允许传递为 null 参数
        Optional<Integer> a = Optional.ofNullable(value1);

        // Optional.of - 如果传递的参数是 null,抛出异常 NullPointerException
        Optional<Integer> b = Optional.of(value2);
        System.out.println(java8Tester.sum(a,b));
    }

    public Integer sum(Optional<Integer> a, Optional<Integer> b){

        // Optional.isPresent - 判断值是否存在
        System.out.println("第一个参数值存在: " + a.isPresent());
        System.out.println("第二个参数值存在: " + b.isPresent());

        // Optional.orElse - 如果值存在,返回它,否则返回默认值
        Integer value1 = a.orElse(new Integer(0));

        //Optional.get - 获取值,值需要存在
        Integer value2 = b.get();
        return value1 + value2;
    }

}

在这里插入图片描述

ifPresent(Consumer consumer)

ifPresent(Consumer consumer):如果option对象保存的值不是null,则调用consumer对象,否则不调用

Optional<Integer> optional1 = Optional.ofNullable(1);
Optional<Integer> optional2 = Optional.ofNullable(null);

// 如果不是null,调用Consumer
optional1.ifPresent(new Consumer<Integer>() {
    @Override
    public void accept(Integer t) {
        System.out.println("valueOfOptional1 is " + t);
    }
});

// null,不调用Consumer
optional2.ifPresent(new Consumer<Integer>() {
    @Override
    public void accept(Integer t) {
        System.out.println("valueOfOptional2 is " + t);
    }
});

在这里插入图片描述

orElse(value)

如果optional对象保存的值不是null,则返回原来的值,否则返回value

Optional<Integer> optional1 = Optional.ofNullable(1);
Optional<Integer> optional2 = Optional.ofNullable(null);
 
// optional1对象保存的值不是null,则返回原来的值,即返回1
System.out.println(optional1.orElse(1000) == 1);// true
// optional2对象保存的值是null,返回value,即返回1000
System.out.println(optional2.orElse(1000) == 1000);// true

在这里插入图片描述

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

用心听。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值