Java8

it2025-12-27  6

Java8_Optional类_简介

一、什么是Optional

Java 8 引入的一个新类 java.util.Opitonal。这是一个封装 Optional值的类。举个例子,假设一个人可能有车也可能没有车,那么我们在声明Person类里的 car 属性时,就不应直接声明为【Car car】,而是声明为Optional 类型。

Optional 类只是对Car进行简单的封装,并未改变Car任何东西,当Car 不存在时,就是一个空的 Optional 对象,可调用方法 Optional.empty() 返回

二、为什么会出现Optional

使用 Optional 替代 null,当我们使用 Optional 包装一个对象时,就说明这个对象可能是缺失的。

在实际开发中,当我们知道一个方法的返回值可能出现 null 时,可以使用Optional 包装返回值。当其他人在调用这个方法时,就能够意识到这个返回值是可能为空的,并且一定会去处理这种情况

三、Optional用法

1)创建 Optional 对象

方法作用Optional.empty()创建一个 空OptionalOptional.ofNullable(T value)允许使用空值创建 OptionalOptional.of(T value)不允许使用空值创建 Optional // 直接返回一个空Optional Optional<Object> op1 = Optional.empty(); // 允许空值创建 Optional Optional<String> op2 = Optional.ofNullable(null); // 不允许使用空值创建 Optional Optional<String> op3 = Optional.of("hell2"); // 报错 Optional<String> op3 = Optional.of(null);

2)Optional 方法

2.1 get()

获取 Optional 类里面的对象,如果没有,报“java.util.NoSuchElementException: No value present”

2.2 orElse(T other)

如果Optional 对象不包含值,则提供一个默认值

2.3 orElseGet(Supplier<? extends T> other)

该方法是 orElse方法的延迟调用版,Supplier 方法只有在 Optional对象不包含值才执行调用

2.4 orElseThrow(Supplier<? extends X> exceptionSupplier)

和get() 方法类似,如果 Optional 不包含值会抛出异常,不过使用orElseThrow()可以定制抛出的异常

2.5isPresent()

判断变量是否存在,返回一个boolean值

2.6 ifPresent(Consumer<? super T> consumer)

接受一个Consumer接口,如果对象存在,则将该对象作为参数传入Consumer处理

2.7 使用 map() 从 Optional对象中提取值

@Test public void test23(){ Apple redApple = new Apple(21, "red"); Optional<Apple> apple = Optional.of(redApple); // 从 Apple对象获取color,仍然返回一个Optional Optional<String> str = apple.map(Apple::getColor); }

2.8 filter(Predicate<? super T> predicate)

如果值存在并且满足提供的谓词,就返回包含该值得 Optional 对象;否则返回一个空的 Optional对象

@Test public void test24(){ Apple redApple = new Apple(21, null); Optional<Apple> apple = Optional.of(redApple); Optional<Apple> a2 = apple.filter(a -> a.getSize() > 10); }
最新回复(0)