Jdk8,Optional类:简化代码,告别空指针NullPointerException
前提
需要了解@FunctionalInterface:函数式接口,很多方法参数都是函数式接口,需要了解的可以看下这篇文章
Jdk8,@FunctionalInterface:函数式接口,学会使用lamda表达式,通俗易懂
比如获取值的orElseGet方法
比如过滤的filter方法
比如加工值的map方法
数据初始化
1:empty
@Test
public void empty() {
System.out.println("Optional.empty() = " + Optional.empty());
}
输出:
Optional.empty() = Optional.empty
2:of
@Test
public void of() {
System.out.println("Optional.of(10) = " + Optional.of(10));
System.out.println("Optional.of(null) = " + Optional.of(null));
}
输出:如果值为空会抛出空指针异常
Optional.of(10) = Optional[10]
java.lang.NullPointerException
3:ofNullable
@Test
public void ofNullable() {
System.out.println("Optional.ofNullable(10) = " + Optional.ofNullable(10));
System.out.println("Optional.ofNullable(null) = " + Optional.ofNullable(null));
}
输出:和of方法的区别,如果值为空不会抛出空指针异常
Optional.ofNullable(10) = Optional[10]
Optional.ofNullable(null) = Optional.empty
数据处理
1.非空判断
@Test
public void isPresent() {
System.out.println("Optional.ofNullable(10).isPresent() = " + Optional.ofNullable(10).isPresent());
System.out.println("Optional.ofNullable(null).isPresent() = " + Optional.ofNullable(null).isPresent());
}
输出
Optional.ofNullable(10).isPresent() = true
Optional.ofNullable(null).isPresent() = false
2.过滤
@Test
public void filter() {
System.out.println("Optional.ofNullable(data).filter(Objects::isNull) = "
+ Optional.ofNullable(10).filter(Objects::isNull));
System.out.println("Optional.ofNullable(data).filter(Objects::nonNull) = "
+ Optional.ofNullable(10).filter(Objects::nonNull));
}
输出:根据Objects::nonNull和Objects::isNull,也就是对象是否进行过滤
Optional.ofNullable(data).filter(Objects::isNull) = Optional.empty
Optional.ofNullable(data).filter(Objects::nonNull) = Optional[10]
3.加工数据map方法
@Test
public void map() {
System.out.println("Optional.ofNullable(\"hello\").map(t -> t + \" world\") = "
+ Optional.ofNullable("hello").map(t -> t + " world"));
System.out.println("Optional.ofNullable(null).map(t -> t + \" world\") = "
+ Optional.ofNullable(null).map(t -> t + " world"));
}
输出
Optional.ofNullable("hello").map(t -> t + " world") = Optional[hello world]
Optional.ofNullable(null).map(t -> t + " world") = Optional.empty
4.加工数据flatMap方法
@Test
public void flatMap() {
System.out.println("Optional.ofNullable(\"hello\").flatMap(t -> Optional.ofNullable(t + \" world\")) = "
+ Optional.ofNullable("hello").flatMap(t -> Optional.ofNullable(t + " world")));
System.out.println("Optional.ofNullable(null).flatMap(t -> Optional.ofNullable(t + \" world\")) = "
+ Optional.ofNullable(null).flatMap(t -> Optional.ofNullable(t + " world")));
}
跟map方法的不同是在返回值类型
输出
Optional.ofNullable("hello").flatMap(t -> Optional.ofNullable(t + " world")) = Optional[hello world]
Optional.ofNullable(null).flatMap(t -> Optional.ofNullable(t + " world")) = Optional.empty
数据获取
1:直接获取
@Test
public void get() {
System.out.println("Optional.ofNullable(10).get() = " + Optional.ofNullable(10).get());
System.out.println("Optional.ofNullable(null).get() = " + Optional.ofNullable(null).get());
}
输出:如果数据为空会抛出异常
Optional.ofNullable(10).get() = 10
java.util.NoSuchElementException: No value present
2:空值直接获取
@Test
public void orElse() {
System.out.println("Optional.ofNullable(10).orElse(100) = " + Optional.ofNullable(10).orElse(100));
System.out.println("Optional.ofNullable(null).orElse(100) = " + Optional.ofNullable(null).orElse(100));
}
三元表达式
public T orElse(T other) {
return value != null ? value : other;
}
输出:这里写法等价于-> 10 != null ? 10 : 100,null != null ? 10 : 100
Optional.ofNullable(10).orElse(100) = 10
Optional.ofNullable(null).orElse(100) = 100
3:空值执行方法获取
@Test
public void orElseGet() {
System.out.println("Optional.ofNullable(10).orElseGet(() -> 10 * 10) = "
+ Optional.ofNullable(10).orElseGet(() -> 10 * 10));
System.out.println("Optional.ofNullable(null).orElseGet(() -> 10 * 10) = "
+ Optional.ofNullable(null).orElseGet(() -> 10 * 10));
}
三元表达式
public T orElseGet(Supplier<? extends T> other) {
return value != null ? value : other.get();
}
输出:如果为空执行() -> 10 * 10获取值
Optional.ofNullable(10).orElseGet(() -> 10 * 10) = 10
Optional.ofNullable(null).orElseGet(() -> 10 * 10) = 100
4:空值抛出自定义异常
@Test
public void orElseThrow() {
System.out.println("Optional.ofNullable(10).orElseThrow(() -> new RuntimeException(\"自定义异常\")) = "
+ Optional.ofNullable(10).orElseThrow(() -> new RuntimeException("自定义异常")));
System.out.println("Optional.ofNullable(null).orElseThrow(() -> new RuntimeException(\"自定义异常\")) = "
+ Optional.ofNullable(null).orElseThrow(() -> new RuntimeException("自定义异常")));
}
输出:如果为空抛出new RuntimeException(“自定义异常”)
Optional.ofNullable(10).orElseThrow(() -> new RuntimeException("自定义异常")) = 10
java.lang.RuntimeException: 自定义异常