1: 概论
Optional 是Java8用来改变java引发NPE的解决办法,但是不是绝对的解决办法
2: 例子:
很多博文一上来就给力以下使用例子
1 @Data 2 public class User { 3 private String name; 4 private Integer age; 5 private Optional<Address> address = Optional.empty(); 6 } 1 @Data 2 public class Address { 3 private Optional<Street> street = Optional.empty(); 4 } 1 @Data 2 public class Street { 3 private String streetName; 4 private Integer streetNo; 5 }
然后使用Optional 进行链式调用
1 public String getUserSteetName(User user) { 2 3 Optional<User> userOptional = Optional.ofNullable(user); 4 final String streetName = userOptional.orElse(new User()).getAddress().orElse(new Address()).getStreet().orElse(new Street()).getStreetName(); 5 return StringUtils.isEmpty(streetName) ? "nothing found" : streetName; 6 }
下面我们对这个类进行序列化与反序列化:
ByteArrayOutputStream bos = new ByteArrayOutputStream();//序列化常规代码 ObjectOutputStream obr = new ObjectOutputStream(bos); obr.writeObject(user); ByteArrayInputStream inputStream = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream inputStream2 = new ObjectInputStream(inputStream); User user = (Address) inputStream2.readObject(); System.out.println(address2.getStreet().get().getStreetName());
抛出: Exception in thread "main" java.io.NotSerializableException: java.util.Optional 异常, 说明我们不能这样用,Optional 不支持Optional
并且也没有实现相关的序列化接口
public final class Optional<T> { /** * Common instance for {@code empty()}.
3:总结
这说明了一个问题:
- Java 8 提供大Optional 并不能支持序列化
- 解决NPE,可以考虑在具体的业务逻辑中 使用Optional类提供相关的解决办法 比如Optional.of() 方法
- Optional一方面的出现,主要还是配合Stream流,比如 reduce() findAny() findFirst()方法提供了返回Optional的操作接口
在实体类 千万不能使用Optional处理NPE,具体的处理逻辑在业务中处理,并且最好完整定义JOPO,不能嵌入无关逻辑,
另一篇文章 : https://www.cnblogs.com/dgwblog/p/11759665.html