一、概述
Optional类主要解决的问题是臭名昭著的空指针异常(NullPointerException),提供了一些的方法代替过去的if-else处理逻辑,并与Stream流结合提供一致性的函数式编程。
二、方法
static <T> Optional<T> | empty() 返回一个空的Optional对象 |
---|---|
boolean | equals(Object obj) |
Optional<T> | filter(Predicate<? super T> predicate) 如果有值,返回符合predicate条件的Optional对象, 否则返回空的Optional对象 |
<U> Optional<U> | flatMap(Function<? super T,Optional<U>> mapper) 如果有值,执行mapper映射函数,返回Optional对象, 如果没有值返回空的Optional对象 |
T | get() 如果值存在返回, 如果不存在抛出异常NoSuchElementException. |
int | hashCode() |
void | ifPresent(Consumer<? super T> consumer) 如果值存在就执行consumer函数,否则什么也不做 |
boolean | isPresent() 判断值是否存在 |
<U> Optional<U> | map(Function<? super T,? extends U> mapper) 如果值存在就执行mapper映射函数, |
static <T> Optional<T> | of(T value) 把指定的value值封装为Optional对象,如果value为null,产生空指针异常 |
static <T> Optional<T> | ofNullable(T value) 把指定的value值封装为Optional对象,如果value为null返回一个空的Optional对象 |
T | orElse(T other) 如果值存在就返回,如果不存在返回other |
T | orElseGet(Supplier<? extends T> other) 如果存在就返回值,如果不存在,执行Supplier返回另外一个值 |
<X extends Throwable> T | orElseThrow(Supplier<? extends X> exceptionSupplier) 如果存在就返回该值,如果不存在抛出由exceptionSupplier生成的异常 |
String | toString() |
三、代码demo
package com.example.es.test;
import java.util.Optional;
/**
* @author
* @Description optional的常用方法
* @date 2022/02/07 16:53
*/
public class TestOptional {
public static void main(String[] args) {
// 1、把一个字符串封装为Optional对象
Optional<String> ofString = Optional.of("qa"); // 参数不能为null
// 2、为指定的值创建Optional对象,如果参数为null,返回空的Optional对象
Optional<String> ofString2 = Optional.ofNullable(null); // 参数可以为null
System.out.println("ofString2:" + ofString2); // Optional.empty
// 3、直接创建一个空的Optional对象
Optional<String> ofString3 = Optional.empty();
System.out.println("ofString3:" + ofString3); // Optional.empty
// 4、get()获得Optional对象中的值,如果值不存在会产生异常
// String text = ofString.get();
// System.out.println("text:" + text); // qa
// String text2 = ofString2.get();
// System.out.println("text2:" + text2); // java.util.NoSuchElementException: No value present
// 5、orElse(),如果Optional对象中有值就返回,没有则返回指定的其他值(相比较上一个是不报空指针异常)
// String text = ofString.orElse("another");
// System.out.println("text:" + text); // qa
// String text2 = ofString2.orElse("another");
// System.out.println("text2:" + text2); // another
// 6、orElseGet(),如果有值就返回,如果Optional对象中没值则创建一个新的
// String text = ofString2.orElseGet(() -> "newString");
// System.out.println("text:" + text); // newString
// 7、orElseThrow(),如果值存在就返回,否则抛出异常
// String text2 = ofString2.orElseThrow(NullPointerException::new);
// System.out.println("text2:" + text2); // java.lang.NullPointerException
// String text = ofString.orElseThrow(NullPointerException::new);
// System.out.println("text:" + text); // qa
// 8、filter(),如果Optional对象有值返回满足指定条件的Optional对象,否则返回空的Optional对象
// String text = ofString.filter(s -> s.length() > 10).orElse("length is letter than 10");
// System.out.println("text:" + text); // length is letter than 10
// String text2 = ofString.filter(s -> s.length() > 1).orElse("length is letter than 1");
// System.out.println("text2:" + text2); // qa
// 9、map(),如果Optional对象的值存在,执行mapper映射函数
// String text = ofString.map(x -> x.toUpperCase(Locale.ROOT)).orElse("Failure");
// System.out.println("text:" + text); // QA
// String text2 = ofString2.map(x -> x.toUpperCase(Locale.ROOT)).orElse("Failure");
// System.out.println("text2:" + text2); // Failure
// 10、ifPresent(),如果Optional对象有值就执行Consumer函数
ofString.ifPresent(s -> System.out.println("处理数据:" + s)); // 处理数据:qa
ofString2.ifPresent(s -> System.out.println("处理数据:" + s)); // 没有值什么也不做
}
}