谈谈java8新特性Optional<T>

java.lang.NullPointerException

相信对每一个java程序员来说都不陌生的,常常因为缺少一个判空导致系统各自通讯错误,异常。从java8开始,给我们提供了一个对象判空操作处理类Optional。
在这里插入图片描述

根据jdk8官方文档,可以知道,该根据类存在于java.util下的final类,也就是说是官方提供给我们的一个工具类。
当然首先我们来看下具体的使用方法:

 Optional<String> optionalS = Optional.of(new String("baomw"));
 System.out.println(optionalS.get());

如上,代码非常简单:效果如下
在这里插入图片描述
核心api说明如下:
方法 描述

api说明
of把指定的值封装为Optional对象,如果指定的值为null,则抛出NullPointerException
ofNullable把指定的值封装为Optional对象,如果指定的值为null,则创建一个空的Optional对象
get如果创建的Optional中有值存在,则返回此值,否则抛出NoSuchElementException
isPresent如果创建的Optional中的值存在,返回true,否则返回false
ifPresent如果创建的Optional中的值存在,则执行该方法的调用,否则什么也不做
orElse如果创建的Optional中有值存在,则返回此值,否则返回一个默认值
orElseGet如果创建的Optional中有值存在,则返回此值,否则返回一个由Supplier接口生成的值
empty创建一个空的Optional对象
orElseThrow如果创建的Optional中有值存在,则返回此值,否则抛出一个由指定的Supplier接口生成的异常
filter如果创建的Optional中的值满足filter中的条件,则返回包含该值的Optional对象,否则返回一个空的Optional对象
map如果创建的Optional中的值存在,对该值执行提供的Function函数调用
flagMap如果创建的Optional中的值存在,就对该值执行提供的Function函数调用,返回一个Optional类型的值,否则就返回一个空的Optional对象
/**
     * Common instance for {@code empty()}.
     */
    private static final Optional<?> EMPTY = new Optional<>();
    /**
     * Returns an {@code Optional} with the specified present non-null value.
     *
     * @param <T> the class of the value
     * @param value the value to be present, which must be non-null
     * @return an {@code Optional} with the value present
     * @throws NullPointerException if value is null
     */
    public static <T> Optional<T> of(T value) {
        return new Optional<>(value);
    }
    /**
     * Returns an {@code Optional} describing the specified value, if non-null,
     * otherwise returns an empty {@code Optional}.
     *
     * @param <T> the class of the value
     * @param value the possibly-null value to describe
     * @return an {@code Optional} with a present value if the specified value
     * is non-null, otherwise an empty {@code Optional}
     */
    public static <T> Optional<T> ofNullable(T value) {
        return value == null ? empty() : of(value);
    }
    /**
     * If a value is present in this {@code Optional}, returns the value,
     * otherwise throws {@code NoSuchElementException}.
     *
     * @return the non-null value held by this {@code Optional}
     * @throws NoSuchElementException if there is no value present
     *
     * @see Optional#isPresent()
     */
    public T get() {
        if (value == null) {
            throw new NoSuchElementException("No value present");
        }
        return value;
    }
        /**
	     * Return {@code true} if there is a value present, otherwise {@code false}.
	     *
	     * @return {@code true} if there is a value present, otherwise {@code false}
	     */
	    public boolean isPresent() {
	        return value != null;
	    }

核心api及关键点如上,注意比较ofofNullable经常会有出现使用Optional.of创建Optional对象时报空指针,因为(如下)是of创建Optional对象的构造方法,发现如果传入的value为null时,会抛出一个空指针异常。

  private Optional(T value) {
        this.value = Objects.requireNonNull(value);
    }
    
    public static <T> T requireNonNull(T obj) {
        if (obj == null)
            throw new NullPointerException();
        return obj;
    }

而对于ofNullable上述源码可以看出,有一个三目表达式,如果value为空,则创建一个空的Optional对象。

  public static <T> Optional<T> ofNullable(T value) {
        return value == null ? empty() : of(value);
    }

如上可以根据实际需要适当选取构造方法。

经常在代码中会有这样的写法,如果值为空就给个默认值的情况:

if(str == null){
	return new String("baomw");
}else{
	return str;
}

当然如果用Optional.orElse(method)就使得这样子的写法异常简单。

  return Optional.ofNullable(str).orElse(new String("baomw"));

使用orElse方法,就很好的解决了,如果值不为空则返回,否则执行orElse里面的方法并返回其返回值。

关于更多其他api的详细用法,有兴趣的可以自己试一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值