java8的Optional

看源码类注释

一个容器对象,可以包含或不包含非空值。

如果存在一个值,{@code isPresent()}将返回{@code true},{@code get()}将返回该值。

提供了依赖于包含值的存在与否的其他方法,例如{@link #orElse(java.lang.Object) orElse()}(如果值不存在,则返回默认值)和{@link #ifPresent(java.util.function.Consumer) ifPresent()}(如果值存在,则执行一段代码块)。

这是一个基于值的类;在{@code Optional}的实例上使用身份敏感操作(包括引用相等性({@code ==}),身份哈希码或同步)可能会产生不可预测的结果,应该避免使用。

1
这是一个基于值的类,应避免使用在共享资源或比较操作。

方法介绍

1
2
boolean isPresent()
如果值存在则方法会返回true,否则返回 false
1
2
T get()
如果在这个Optional中包含这个值,返回值,否则抛出异常:NoSuchElementException
1
2
T orElse(T other)
如果存在该值,返回值, 否则返回 other。
1
2
void ifPresent(Consumer<? super T> consumer)
如果值存在则使用该值调用 consumer , 否则不做任何事情。
1
2
static <T> Optional<T> empty()
返回空的 Optional 实例。
1
2
Optional<T> filter(Predicate<? super <T> predicate)
如果值存在,并且这个值匹配给定的 predicate,返回一个Optional用以描述这个值,否则返回一个空的Optional
1
2
<U> Optional<U> flatMap(Function<? super T,Optional<U>> mapper)
如果值存在,返回基于Optional包含的映射方法的值,否则返回一个空的Optional
1
2
<U>Optional<U> map(Function<? super T,? extends U> mapper)
如果有值,则对其执行调用映射函数得到返回值。如果返回值不为 null,则创建包含映射返回值的Optional作为map方法返回值,否则返回空Optional
1
2
static <T> Optional<T> of(T value)
返回一个指定非null值的Optional。
1
2
static <T> Optional<T> ofNullable(T value)
如果为非空,返回 Optional 描述的指定值,否则返回空的 Optional
1
2
T orElseGet(Supplier<? extends T> other)
如果存在该值,返回值, 否则触发 other,并返回 other 调用的结果。
1
2
<X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)
如果存在该值,返回包含的值,否则抛出由 Supplier 继承的异常

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
public class Test{
public static void main(String[] args) {

// 案例一 如果为空就抛异常
Person person = new Person();
if (null == person) {
throw new RuntimeException("person为空");
}
Optional.ofNullable(person).orElseThrow(() -> new RuntimeException("person为空"));

// 案例二 如果不空才处理
Optional.ofNullable(person).ifPresent(person1 -> System.out.println(person1.getAge()));

// 案例三 如果符合条件返回原来的对象,不符合返回空
person.setAge(17);
Boolean pass = Optional.ofNullable(person).filter(person12 -> person12.getAge() > 18).isPresent();
// 不符合
System.out.println(pass);

// 案例四 如果有值,进行值转换
Optional.ofNullable(person).map((Function<Person, Object>) person13 -> {
person13.setAge(person13.getAge() + 10);
return person13;
});
person.setName("姓名");
String name = Optional.ofNullable(person).map( person13 -> person13.getName()).orElse("");
System.out.println(name);

}

}

class Person {

private String name;
private Integer age;

public Person() {
}

public Person(String name, Integer age) {
this.name = name;
this.age = age;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Integer getAge() {
return age;
}

public void setAge(Integer age) {
this.age = age;
}
}

java8的Optional
http://hanqichuan.com/2023/08/23/java/java8的Optional/
作者
韩启川
发布于
2023年8月23日
许可协议