Optional使用详解

Optional使用详解

一、Optional基本介绍

​ optional是一个容器类,属于java8的一个新特性,它可以帮助我们基于空值进行一系列处理。所以说,平时我们会在和空值打交道的时候使用它。

在这里插入图片描述

在这里插入图片描述

​ 经过上述描述我想你已经对optional的使用场景有了一个简单的概念,但是有一个误区得在学习初期就避免。那就是Optional所针对的空值是特指***null***的,它无法对空字符串等作出有效判断,下面有一个例子可以有效佐证这一观点。

@Test
public void testOptional(){
    String a="a";
    String b=" ";
    String c="";
    String d=null;

    System.out.println("a:"+Optional.ofNullable(a).isPresent());
    System.out.println("b:"+Optional.ofNullable(b).isPresent());
    System.out.println("c:"+Optional.ofNullable(c).isPresent());
    System.out.println("d:"+Optional.ofNullable(d).isPresent());
}

控制台输出结果:

在这里插入图片描述

​ 可能目前你对于上面的代码还有些陌生,但没关系后面会对其进行详细讲解。你目前只要知道isPresent方法可以对空值进行判断并返回一个布尔值,如果对象为空则返回false,否则返回true。因此从上面的Demo中可知,Optional对于空值的判断只针对于null,切忌将其使用在字符串判空场景。

二、Optional的方法介绍

在这里插入图片描述

如上图所示就是Optional所拥有的方法,接下来我将会对其一一进行讲解。

2.1.1、of(T value)

​ 虽然Optional也有构造函数,但Optional的构造函数是私有private修饰的,因此外部无法直接使用构造函数创建Optional对象。

​ 而如果你想创建一个Optional对象,有三种方法可行。其中一种就是使用of()创建Optional对象。需要注意的是,使用of()创建对象,那么你要保证你用Optional所包裹着的对象是非空的,也就是说of()创建是非空的Optional对象,如果你传递的是一个空值,那么你的代码将会报***NullPointerException***异常。

@Test
public void testOptional(){
    String a="a";
    String b=" ";
    String c="";
    String d=null;

    System.out.println("a:"+Optional.of(a).isPresent());
    System.out.println("b:"+Optional.of(b).isPresent());
    System.out.println("c:"+Optional.of(c).isPresent());
    System.out.println("d:"+Optional.of(d).isPresent());
}

控制台输出:

在这里插入图片描述

2.1.2、ofNullable(T value)

​ 望名而知意,使用ofNullable()创建对象,Optional所包裹的对象可为空,也可为非空,限制条件比较少,这也是我们常用的创建Optional对象的方式。

@Test
public void testOptional(){
    String a="a";
    String b=" ";
    String c="";
    String d=null;

    System.out.println("a:"+Optional.ofNullable(a).isPresent());
    System.out.println("b:"+Optional.ofNullable(b).isPresent());
    System.out.println("c:"+Optional.ofNullable(c).isPresent());
    System.out.println("d:"+Optional.ofNullable(d).isPresent());
}

控制台所示:

在这里插入图片描述

2.1.3、empty()

​ 使用empty()创建Optional对象,你无需传递参数,因为它是创建一个空的Optional对象。

@Test
public void testOptional(){
    String a="a";
    String b=" ";
    String c="";
    String d=null;

    System.out.println(Optional.empty().isPresent());
}

控制台输出:

在这里插入图片描述

2.2.1、get()

​ 使用get()方法,你可以获取Optional所包含的对象,当然如果你对一个空Optional使用get方法,那它就会报***NoSuchElementException***异常,所以使用此方法也要小心注意别对空的Optional使用。

@Test
public void testOptional(){
    String a="a";
    String d=null;

    System.out.println(Optional.ofNullable(a).get());
    System.out.println(Optional.ofNullable(d).get());
}

控制台输出:

在这里插入图片描述

2.2.2、isPresent()

​ 这个方法大家估计已经十分眼熟了,在上面几个Demo中被频繁使用。并且前面也提到了,使用此方法可以对Optional所包含的对象进行判断。如果Optional所包含的对象为空则返回false,反之返回true。

@Test
public void testOptional(){
    String a="a";
    String d=null;

    System.out.println(Optional.ofNullable(a).isPresent());
    System.out.println(Optional.ofNullable(d).isPresent());
}

控制台输出:

在这里插入图片描述

2.2.3、ifPresent(Consumer<? super T> consumer)

​ 此方法需要传递一个Consumer参数,Consumer是一个函数式接口,同样是java8的一个新特性。它需要一个入参,但没有返回值,是一种消费型接口。使用ifPresent方法,当Optional所包含的对象为空时,不会触发消费方法;当包含的对象不为空时,则会触发此方法。

@Test
public void testOptional(){
String a="a";
String d=null;

Optional.ofNullable(a).ifPresent(e-> System.out.println(e));
Optional.ofNullable(d).ifPresent(e-> System.out.println(e));
}

控制台输出:

在这里插入图片描述

2.2.4、filter(Predicate<? super T> predicate)

​ filter方法顾名思义起到了一个过滤作用,它接收一个断言Predicate,Predicate会对判断逻辑进行处理并返回一个布尔值,满足条件的返回true,否则返回false。使用filter方法,满足筛选条件的返回原Optional对象,不满足条件的返回一个空的Optional对象。

@Test
public void testOptional(){
    String a="a";
    String b="b";

    System.out.println(Optional.ofNullable(a).filter(e -> e.equals("a")).isPresent());
    System.out.println(Optional.ofNullable(b).filter(e -> e.equals("a")).isPresent());
}

控制台输出:

在这里插入图片描述

2.2.5、map(Function<? super T, ? extends U> mapper)

​ map方法接收一个function型接口方法,function有一个入参并且有返回值。使用map方法时,如果Optional包含的对象为空时,则返回一个空的Optional对象;如果包含的对象不为空,则执行给定的逻辑,生成新的对象并用Optional包裹返回。

@Test
public void testOptional(){
    String a="a";
    String b="b";

    System.out.println(Optional.ofNullable(a).map(e -> e + "字母").get());
    System.out.println(Optional.ofNullable(b).map(e -> e + "字母").get());
}

控制台输出:

在这里插入图片描述

2.2.6、flatMap(Function<? super T, Optional mapper)

​ flatMap与map类似都是对输入的参数进行一系列的逻辑处理。只不过flatMap所传参数function的返回值必须为Optional。

@Test
public void testOptional(){
    String a="a";

    System.out.println(Optional.ofNullable(a).flatMap(e -> Optional.ofNullable(e + "字母")).get());
}

控制台输出:

在这里插入图片描述

2.2.7、orElse(T other)

​ orElse方法需要一个和Optional所包含的对象同类型的一个入参,如果Optional所包含的对象为空,则返回orElse传入的参数,否则返回Optional包含的对象。该方法可以当做为对象赋默认值使用。

@Test
public void testOptional(){
    String a="a";
    String b=null;
    System.out.println(Optional.ofNullable(a).orElse("默认字母z"));
    System.out.println(Optional.ofNullable(b).orElse("默认字母z"));
}

控制台输出:

在这里插入图片描述

2.2.8、orElseGet(Supplier<? extends T> other)

​ orElseGet需要一个supplier参数,supplier是一个生产型接口,不需要入参,会经过一系列逻辑处理有一个返回值。使用orElseGet方法时,如果Optional为空,则执行supplier的逻辑,并返回supplier的返回值,否则就返回Optional所包含的对象。

@Test
public void testOptional(){
    String a="a";
    String b=null;
    System.out.println(Optional.ofNullable(a).orElseGet(() -> "默认字母z"));
    System.out.println(Optional.ofNullable(b).orElseGet(() -> "默认字母z"));
}

控制台输出:

在这里插入图片描述

2.2.9、oElseThrow(Supplier<? extends X> exceptionSupplier)

​ orElseThrow方法和orElseGet方法很类似,只不过supplier的返回值限定为一种异常。

@Test
public void testOptional(){
    String a="a";
    String b=null;
    System.out.println(Optional.ofNullable(a).orElseThrow(() -> new NullPointerException()));
    System.out.println(Optional.ofNullable(b).orElseThrow(() -> new NullPointerException()));
}

控制台输出:

在这里插入图片描述

三、总结

​ java8的新特性Optional的内容大概就这些,希望对你处理空值有所帮助,并且Optional的源码也很简单,推荐大家都去看看学习下加深印象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

7号525

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

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

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

打赏作者

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

抵扣说明:

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

余额充值