1.Optional
Optional是Java8提供的为了解决null安全问题的一个API。善用Optional可以使代码中很多繁琐、丑陋的设计变得十分优雅。
java8之所以要提出这个对象,是因为java8中主要引入了lambda表达式,这种函数式编程中大量的链式调用,如果用原始的方法去判断nullpointException,会破坏lambda这种风格。
比如在Android开发中,接口json中,对象里面有对象,对象中有属性。每次使用或作为参数传参时,都要!=null非空判断。一个还好,当属性嵌套得非常深的时候,就会出现以下代码。
public class Person {
private int age;
private String name;
private Address address;
public Person(int age, String name, Address address) {
this.age = age;
this.name = name;
this.address = address;
}
//…省略set、get方法
public static class Address {
private String roomNum;
private String areaNum;
public Address(String roomNum, String areaNum) {
this.roomNum = roomNum;
this.areaNum = areaNum;
}
//…省略set、get方法
}
}
//错误码
String errorNum = “error”;
if (barry.getAddress() != null
&& barry.getAddress().getAreaNum() != null
&& !barry.getAddress().getAreaNum().equals(errorNum)) {
String areaNum = barry.getAddress().getAreaNum();
//最后使用areaNum属性做事情
System.out.println("areaNum = " + areaNum);
}
总之,就是不好看,臃肿,也不优雅。
Java8中,为了解决以上问题,引入了Optional类。Optional是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
2.Optional中的方法
①创建Optional
Optional有三个静态构造方法:
(1) Optional.of(T value)
public static < T> Optional< T> of(T value) {
return new Optional<>(value);
}
该方法通过一个非 null 的 value 来构造一个 Optional,返回的 Optional 包含了 value 这个值。对于该方法,传入的参数一定不能为 null,否则便会抛出 NullPointerException。
举例:
Optional< String> op1 = Optional.of(“Hello”);
System.out.println(op1.isPresent()); // 输出 true
System.out.println(op1.get()); // 输出 Hello