您的位置:

Java Optional用法详解

一、Optional简介

Optional是Java 8中引入的一个新类,属于java.util包下面,用来解决空指针异常问题。在我们日常开发过程中,空指针异常是比较常见的异常。尤其是当我们处理复杂的对象时,有可能会出现对象为空的情况。在Java 8之前,为了避免空指针异常,我们需要先判断对象是否为空,再进行相应的操作。但是这种做法毕竟比较繁琐。而Optional则是一种更加优雅的解决方案。

二、Optional的用法

1.创建Optional对象

Optional是一个泛型类,可以用来包装任意类型的对象。下面是创建Optional对象的几种方式:

//创建一个包装了空值的Optional对象
Optional emptyOptional = Optional.empty();

//创建一个包装了非空值的Optional对象
Optional
    strOptional = Optional.of("hello world");

//创建一个包装了可空值的Optional对象
Optional
     nullableOptional = Optional.ofNullable(null);

    
   
  

2.获取Optional对象中的值

获取Optional对象中的值有两种方式,一种是使用get()方法,另一种是使用orElse()方法。如果Optional对象中的值为空,使用get()方法会抛出NoSuchElementException异常,而使用orElse()方法则会返回一个默认值。

//直接获取Optional对象中的值,如果值为空,抛出NoSuchElementException异常
String str1 = strOptional.get();

//获取Optional对象中的值,如果值为空,返回一个默认值
String str2 = emptyOptional.orElse("default value");

3.判断Optional对象中是否存在值

判断Optional对象中是否存在值可以使用isPresent()方法。如果存在值则返回true,否则返回false。

boolean isPresent = strOptional.isPresent();

4.在Optional对象中执行操作

Optional对象提供了一些方法,可以在Optional对象中执行操作。这些方法包括:

4.1 ifPresent()

ifPresent()方法接收一个Consumer函数式接口作为参数,如果Optional对象中存在值,则执行该函数式接口,否则不做任何操作。

strOptional.ifPresent(s -> System.out.println(s));

4.2 filter()

filter()方法接收一个Predicate函数式接口作为参数,用来过滤Optional对象中的值。如果Predicate函数式接口返回true,则表示Optional对象中的值符合要求,否则表示不符合要求。

Optional filteredOptional = strOptional.filter(s -> s.length() > 10);

  

4.3 map()

map()方法接收一个Function函数式接口作为参数,用来对Optional对象中的值进行转换。如果Optional对象中的值不为空,则将其传入Function函数式接口,并返回一个新的Optional对象。

Optional lengthOptional = strOptional.map(s -> s.length());

  

4.4 flatMap()

flatMap()方法接收一个Function函数式接口作为参数,用来对Optional对象中的值进行转换。和map()方法类似,不同的是,返回值类型是一个Optional对象。

Optional flatLengthOptional = strOptional.flatMap(s -> Optional.ofNullable(s.length()));

  

4.5 orElseGet()

orElseGet()方法和orElse()方法类似,不同的是,它接收一个Supplier函数式接口作为参数,用来返回一个默认值。

String orElseGetResult = emptyOptional.orElseGet(() -> "default value");

4.6 orElseThrow()

orElseThrow()方法和orElse()方法类似,不同的是,它会抛出一个指定的异常,而不是返回一个默认值。该方法接收一个Supplier函数式接口作为参数,用来返回一个异常实例。

String orElseThrowResult = emptyOptional.orElseThrow(() -> new IllegalArgumentException("value is null"));

三、Optional的优缺点

3.1 优点

  • 解决空指针异常问题
  • 提供一种优雅的写法,避免了繁琐的if判断

3.2 缺点

  • 可能会引起一些新的问题,如当我们使用Optional对象时,可能会忘记检查是否存在值,从而导致NoSuchElementException异常。
  • 需要学习一些新的概念,如容器、流等。

四、总结

本文介绍了Java 8中的Optional类,包括创建Optional对象、获取Optional对象中的值、判断Optional对象中是否存在值、在Optional对象中执行操作、Optional的优缺点等方面。Optional是一种解决空指针异常问题的优雅方式,但是它也存在着一些缺点。在使用Optional时,需要注意它的特点,并且掌握一些必要的概念,才能更好的发挥它的作用。