java8新特性——Optional
在开发的时候,经常会遇到空指针异常的问题,为避免该问题,java8引入了Optional 类,提前发现数据是否为空,从而根据业务需求决定是否为其提前创建对象。
概念
Optional 类(java.util.Optional) 是一个容器类, 代表一个值存在或不存在, 原来用 null 表示一个值不存在, 现在 Optional 可以更好的表达这个概念。 并且可以避免空指针异常。
相信很多人会好奇Optional 是怎么避免空指针异常的吧,这在“举例”中会详细分析,大体解决思路就是在空指针异常前,在获取对象的时候就会判断是否为空,没有创建默认选项的话,会提前报错,从而在空指针发生前提示,方便定位空指针发生的位置,从而让开发者不必再debug去找问题。
常用方法:
-
Optional.of(T t) : 创建一个 Optional 实例 Optional.empty() : 创建一个空的 Optional 实例 Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例 isPresent() : 判断是否包含值 orElse(T t) : 如果调用对象包含值, 返回该值, 否则返回t orElseGet(Supplier s) :如果调用对象包含值, 返回该值, 否则返回 s 获取的值 map(Function f): 如果有值对其处理, 并返回处理后的Optional, 否则返回Optional.empty() flatMap(Function mapper):与 map 类似, 要求返回值必须是Optional
举例
创建一个Book对象:
class Book { private String name; private int page; private Type type; public Book() { } public Book(String name, int page, Type type) { this.name = name; this.page = page; this.type = type; } @Override public String toString() { return "Book{" + "name=" + name + + ", page=" + page + ", type=" + type + }; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Book book = (Book) o; return page == book.page && Objects.equals(name, book.name) && type == book.type; } @Override public int hashCode() { return Objects.hash(name, page, type); } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getPage() { return page; } public void setPage(int page) { this.page = page; } public Type getType() { return type; } public void setType(Type type) { this.type = type; } }
- 获取时异常 由于在获取Book对象是,是null的,所以直接报错,方便开发者定位到空值的位置
Optional<Book> empty = Optional.empty(); empty.get();
java.util.NoSuchElementException: No value present at java.util.Optional.get(Optional.java:135) at com.atguigu.spring5.test.TestOptional.test1(TestOptional.java:11)
- 一般使用默认值填充
Optional<Book> empty = Optional.empty(); Book book = empty.orElseGet(() -> new Book("java",100,Type.STUDY)); System.out.println(book);
Book{name=java, page=100, type=STUDY}
- 三种创建方式
Optional<Book> option1 = Optional.empty(); Optional<Book> option2 = Optional.of(new Book()); Optional<Object> option3 = Optional.ofNullable(null); Optional<Book> book = Optional.ofNullable(new Book());
- map方法
Optional<Book> option1 = Optional.empty(); Optional<Book> option2 = Optional.of(new Book("java",100,Type.STUDY)); Optional<String> s1 = option1.map(Book::getName); Optional<String> s2 = option2.map(Book::getName); System.out.println(s1); System.out.println(s2.get());
Optional.empty java