龙空技术网

java8新特性——Optional

梅子抱福 345

前言:

此刻我们对“java135”可能比较着重,看官们都想要学习一些“java135”的相关内容。那么小编也在网上收集了一些关于“java135””的相关资讯,希望小伙伴们能喜欢,你们快快来了解一下吧!

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}

1

三种创建方式

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

标签: #java135