Optional是Java8的新特性
特点:
Optional就好像是包装类,可以把我们的具体数据封装Optional对象内部,然后可以使用Optional的Api操作封装的数据是否为空,优雅的避免空指针
可以使用Optional中的ofNullable()静态方法封装数据
Author author = getAuthor();
Optional<Author> optionalAuthor = Optional.ofNullable(author);
optionalAuthor.ifPresent(author1-> System.out.println(author1.getName()));
在实际开发中,我们的数据大多数都是从数据库中获取的,Mybatis3.5版本可以支持Optional了,我们可以直接把mapper中的方法返回值定义成Optional,Mybatis会自动将数据封装成Optional类型。
如果你肯定你的数据不为null,那么可以使用Optional.of()方法,如果你的数据为null,会报空指针异常(NullPointerException)
Author author = getAuthor();
Optional optionalAuthor = Optional.of(author);
System.out.println(optionalAuthor);
扩展方法:Optional.empty()可以是空对象转为Optional类型的空对象,鸡肋,了解即可。
我们获取到一个Optional对象,我们该如何对其中的数据进行使用,可以使用ifPresent方法来进行消费,可以有效避免空指针异常
例如:
Author author = getAuthor();
Optional<Author> optionalAuthor = Optional.ofNullable(author);
optionalAuthor.ifPresent(author1-> System.out.println(author1.getName()));
不推荐通过Optional封装对象调用get方法直接获取,如果对象为null,会报错,(NoSuchElementException)
如果我们期望安全的获取值,我们不推荐使用get方法,可以通过以下方法:
orElseGet
可以设置,获取的对象的数据为空时,设置一个默认对象
// 如果optionalAuthor为null时,会使用optionalAuthor.orElseGet(() -> new Author());创建的对象
Optional<Author> optionalAuthor = getOptionalAuthor();
optionalAuthor.ifPresent(author1-> System.out.println(author1.getAge()));
Author author1 = optionalAuthor.orElseGet(() -> new Author());
System.out.println(author1.getAge());
orElseThrow
获取不到数据可以自定义异常,在开发中可以通过全局异常类进行捕获
Optional<Author> optionalAuthor = getOptionalAuthor();
optionalAuthor.ifPresent(author1-> System.out.println(author1.getAge()));
Author author = optionalAuthor.orElseThrow(() -> new RuntimeException("author为null"));
System.out.println(author);
通过使用filter进行过滤,如果过滤后,没有符合条件的,那么会创建一个新的Optional对象为null
Optional<Author> optionalAuthor = getOptionalAuthor();
optionalAuthor.filter(author -> author.getAge()>10).ifPresent(author1-> System.out.println(author1.getAge()));
使用isPresent()判断数据是否存在,我的评价是不如直接使用ifPresent()
Optional<Author> optionalAuthor = getOptionalAuthor();
if (optionalAuthor.isPresent()){
System.out.println(optionalAuthor.get().getAge());
}
通过map方法,与stream流中的map方法相似
Optional<Author> optionalAuthor = getOptionalAuthor();
optionalAuthor.map(author -> author.getBooks())
.ifPresent(books -> System.out.println(books));