代码运行环境
$ java -version
java version "1.8.0_251"
Java(TM) SE Runtime Environment (build 1.8.0_251-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.251-b08, mixed mode)
目录
1、empty()
2、of()
3、ofNullable()
4、isPresent()
5、get()
6、ifPresent()
7、filter()
8、map()
9、flatMap()
10、orElse()
11、orElseGet()
12、orElseThrow()
完整代码
1、empty()
empty 方法返回一个不包含值的 Optional 实例
Optional empty = Optional.empty();
System.out.println(empty);
// Optional.empty
2、of()
of 方法会返回一个 Optional 实例
如果传入的值非空,会返回包含指定值的对象;
如果传入空,会立刻抛出空指针异常。
Optional<String> name = Optional.of("Tom");
System.out.println(name);
// Optional[Tom]
Optional.of(null);
// java.lang.NullPointerException
3、ofNullable()
ofNullable 方法会返回一个 Optional 实例
如果传入的值非空,会返回包含指定值的对象;
如果传入空,会返回不包含任何值的 empty 对象,也就是最开始介绍的Optional.empty()对象。
Optional<String> name = Optional.ofNullable("Tom");
System.out.println(name);
// Optional[Tom]
Optional<Object> optional = Optional.ofNullable(null);
System.out.println(optional);
// Optional.empty
4、isPresent()
isPresent 方法用来判断实例是否包含值
如果包含非空值,返回 true
否则返回 false
boolean isPresent1 = Optional.ofNullable("Tom")
.isPresent();
System.out.println(isPresent1);
// true
boolean isPresent2 = Optional.ofNullable(null)
.isPresent();
System.out.println(isPresent2);
// false
5、get()
get 方法
如果实例包含非空值,则返回当前值;
否则抛出 NoSushElementException 异常。
String tom = Optional.ofNullable("Tom")
.get();
System.out.println(tom);
// Tom
Optional.ofNullable(null)
.get();
// java.util.NoSuchElementException: No value present
6、ifPresent()
ifPresent 方法
当实例包含非空值时,执行传入的 Consumer,比如调用一些其他方法;
如果包含的值为空,不执行任何操作。
Optional.ofNullable("Tom")
.ifPresent(x -> {
System.out.println(x);
// Tom
});
Optional.ofNullable(null)
.ifPresent(x -> {
System.out.println(x);
// 没有任何输出
});
7、filter()
filter 方法用于过滤不符合条件的值,接收一个Predicate参数,
如果符合条件,会返回当前的Optional实例,
否则返回 empty 实例。
Optional<String> optional1 = Optional.ofNullable("Tom")
.filter(x -> x.contains("T"));
System.out.println(optional1);
// Optional[Tom]
Optional<String> optional2 = Optional.ofNullable("Tom")
.filter(x -> x.contains("J"));
System.out.println(optional2);
// Optional.empty
8、map()
map 方法是链式调用避免空指针的核心方法
当实例包含值时,对值执行传入的Function函数接口方法,并返回一个代表结果值新的Optional实例,也就是将返回的结果再次包装成Optional对象。
Optional<String> optional1 = Optional.ofNullable("Tom")
.map(x -> {
return "hi " + x;
});
System.out.println(optional1);
// Optional[hi Tom]
Optional<String> optional2 = Optional.ofNullable(null)
.map(x -> {
return "hi " + x;
});
System.out.println(optional2);
// Optional.empty
9、flatMap()
flatMap 方法与 map 方法类似,
唯一不同的地方在于:需要手动将返回的值,包装成Optional实例,并且参数值不允许为空。
Optional<String> optional1 = Optional.ofNullable("Tom")
.flatMap(x -> {
return Optional.of("hi " + x);
});
System.out.println(optional1);
// Optional[hi Tom]
Optional<String> optional2 = Optional.ofNullable(null)
.flatMap(x -> {
return Optional.of("hi " + x);
});
System.out.println(optional2);
// Optional.empty
10、orElse()
orElse 方法
如果实例包含非空值,那么返回当前值;
否则返回指定的默认值。
String name1 = Optional.ofNullable("Tom")
.orElse("Jack");
System.out.println(name1);
// Tom
Object name2 = Optional.ofNullable(null)
.orElse("Jack");
System.out.println(name2);
// Jack
11、orElseGet()
orElseGet 方法
如果实例包含非空值,返回这个值;
否则,它会执行作为参数传入的Supplier函数式接口方法,并返回其执行结果。
String name1 = Optional.ofNullable("Tom")
.orElseGet(() -> {
return "Jack";
});
System.out.println(name1);
// Tom
Object name2 = Optional.ofNullable(null)
.orElseGet(() -> {
return "Jack";
});
System.out.println(name2);
// Jack
12、orElseThrow()
orElseThrow 方法
如果实例包含非空值,返回这个值;
否则,它会执行作为参数传入的异常类。
String name1 = Optional.ofNullable("Tom")
.orElseThrow(() -> new RuntimeException("参数为空"));
System.out.println(name1);
// Tom
Object name2 = Optional.ofNullable(null)
.orElseThrow(() -> new RuntimeException("参数为空"));
System.out.println(name2);
// java.lang.RuntimeException: 参数为空
完整代码
package com.example.demo;
import org.junit.jupiter.api.Test;
import java.util.Optional;
public class OptionalTest {
@Test
public void testOptionalEmpty() {
Optional empty = Optional.empty();
System.out.println(empty);
// Optional.empty
}
@Test
public void testOptionalOf() {
Optional<String> name = Optional.of("Tom");
System.out.println(name);
// Optional[Tom]
Optional.of(null);
// java.lang.NullPointerException
}
@Test
public void testOptionalOfNullable() {
Optional<String> name = Optional.ofNullable("Tom");
System.out.println(name);
// Optional[Tom]
Optional<Object> optional = Optional.ofNullable(null);
System.out.println(optional);
// Optional.empty
}
@Test
public void testOptionalIsPresent() {
boolean isPresent1 = Optional.ofNullable("Tom")
.isPresent();
System.out.println(isPresent1);
// true
boolean isPresent2 = Optional.ofNullable(null)
.isPresent();
System.out.println(isPresent2);
// false
}
@Test
public void testOptionalGet() {
String tom = Optional.ofNullable("Tom")
.get();
System.out.println(tom);
// Tom
Optional.ofNullable(null)
.get();
// java.util.NoSuchElementException: No value present
}
@Test
public void testOptionalIfPresent() {
Optional.ofNullable("Tom")
.ifPresent(x -> {
System.out.println(x);
// Tom
});
Optional.ofNullable(null)
.ifPresent(x -> {
System.out.println(x);
// 没有任何输出
});
}
@Test
public void testOptionalFilter() {
Optional<String> optional1 = Optional.ofNullable("Tom")
.filter(x -> x.contains("T"));
System.out.println(optional1);
// Optional[Tom]
Optional<String> optional2 = Optional.ofNullable("Tom")
.filter(x -> x.contains("J"));
System.out.println(optional2);
// Optional.empty
}
@Test
public void testOptionalMap() {
Optional<String> optional1 = Optional.ofNullable("Tom")
.map(x -> {
return "hi " + x;
});
System.out.println(optional1);
// Optional[hi Tom]
Optional<String> optional2 = Optional.ofNullable(null)
.map(x -> {
return "hi " + x;
});
System.out.println(optional2);
// Optional.empty
}
@Test
public void testOptionalFlatMap() {
Optional<String> optional1 = Optional.ofNullable("Tom")
.flatMap(x -> {
return Optional.of("hi " + x);
});
System.out.println(optional1);
// Optional[hi Tom]
Optional<String> optional2 = Optional.ofNullable(null)
.flatMap(x -> {
return Optional.of("hi " + x);
});
System.out.println(optional2);
// Optional.empty
}
@Test
public void testOptionalOrElse() {
String name1 = Optional.ofNullable("Tom")
.orElse("Jack");
System.out.println(name1);
// Tom
Object name2 = Optional.ofNullable(null)
.orElse("Jack");
System.out.println(name2);
// Jack
}
@Test
public void testOptionalOrElseGet() {
String name1 = Optional.ofNullable("Tom")
.orElseGet(() -> {
return "Jack";
});
System.out.println(name1);
// Tom
Object name2 = Optional.ofNullable(null)
.orElseGet(() -> {
return "Jack";
});
System.out.println(name2);
// Jack
}
@Test
public void testOptionalOrElseThrow() {
String name1 = Optional.ofNullable("Tom")
.orElseThrow(() -> new RuntimeException("参数为空"));
System.out.println(name1);
// Tom
Object name2 = Optional.ofNullable(null)
.orElseThrow(() -> new RuntimeException("参数为空"));
System.out.println(name2);
// java.lang.RuntimeException: 参数为空
}
}
参考
【Java 8系列】Java开发者的判空利器 – Optional
Optional 是个好东西,你真的会用么?
————————————————
版权声明:本文为CSDN博主「彭世瑜」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。