前言
在Java开发中,相信一定遇到过不少这样的异常NullPointerException(NPE),没错,即空指针异常,这个异常 在Java程序开发中经常遇见,那么如何有效的避免空指针异常,在程序开发中是免不了的判断,于是JDK8提供了一个语法糖,也就是Optional关键字,Optional是一个用于解决空指针异常的容器,它可以保存类型T的值,或者仅仅保存null,能在开发过程中很好的解决判断是否为空
Optional使用
Optional.of
Optional.of可以传入一个泛型,但是只要时该数据为null,就会抛异常
public class Optional1Demo {
public static void main(String[] args) {
String data = "aaa";
Optional<String> optional = Optional.of(data);
System.out.println(optional.get());
}
}
反之
public class Optional2Demo {
public static void main(String[] args) {
String data = null;
Optional<String> optional = Optional.of(data);
System.out.println(optional.get());
}
}
会抛空指针异常
Optional.ofNullable
Optional.of可以传入一个泛型,但是只要时该数据为null,不会抛异常
public class Optional3Demo {
public static void main(String[] args) {
String data = null;
Optional<String> optional = Optional.ofNullable(data);
System.out.println(optional.get());
}
}
Optional.empty()
创建一个空的Option
public class Optional4Demo {
public static void main(String[] args) {
String data = null;
Optional<String> optional = Optional.empty();
}
}
map使用
用于传入一个Function函数
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class User {
private Long id;
private String name;
}
public class Optional5Demo {
public static void main(String[] args) {
User user = new User(1L, "aaa");
Optional<String> optional = Optional.ofNullable(user).map(User::getName);
}
}
ifPresent使用
ifPresent没有返回值,传入的是一个Consumer函数
public class Optional6Demo {
public static void main(String[] args) {
User user = new User(1L, "aaa");
Optional.ofNullable(user).ifPresent(e->{
System.out.println(user);
});
}
}
isPresent使用
isPresent()用于判断Option中的值是否为空
public class Optional7Demo {
public static void main(String[] args) {
String data = "aaa";
Optional<String> optional = Optional.ofNullable(data);
if (optional.isPresent()) {
System.out.println(optional.get());
} else {
System.out.println("空值");
}
}
}
orElse使用
orElse()用于判断如果传入的值是空的,就会返回orElse里面的值
public class Optional8Demo {
public static void main(String[] args) {
String data = "aaa";
String optional = Optional.ofNullable(data).orElse(getData());
System.out.println(optional);
}
public static String getData() {
System.out.println(12);
return "aaa";
}
}
备注:oeElse()里面如果是一个方法的话,会执行一次
orElseGet使用
orElseGet()用于判断如果传入的值是空的,就会返回orElse里面的值
public class Optional9Demo {
public static void main(String[] args) {
String data = "aaa";
String optional = Optional.ofNullable(data).orElseGet(()->{
System.out.println("hello world");
return "xxx";
});
System.out.println(optional);
}
}
orElseThrow使用
orElseThrow()用于抛异常处理
public class Optional10Demo {
public static void main(String[] args) {
String data = "aaa";
String optional = Optional.ofNullable(data).orElseThrow();
System.out.println(optional);
}
}
ifPresentOrElse
ifPresentOrElse是jdk9版本以上新增的语法,使用如下
public class Optional11Demo {
public static void main(String[] args) {
AtomicReference<String> data = new AtomicReference<>("aaa");
Optional.ofNullable(data).ifPresentOrElse(x -> {
data.set("asdasd");
System.out.println(x);
}, () -> {
data.set("asdasd");
});
System.out.println(data.get());
}
}
总结
Option可以用于空数据判断,不过判空的方式有很多种,看个人使用和习惯