作为一个开发人员,你一定对这个异常非常熟悉:空指针异常(NullPointerException)。
为了避免出现这个异常,我们经常会使用if语句做判空操作,繁琐的if语句就会导致代码不够简洁。于是Java8 引入了Optional类,主要解决空指针异常(NullPointerException)问题。
对于比较简单的判空问题,其实并不太推荐使用Optional,可以使用三元运算等方式来替换if-esle。对于较为复杂的判空(如多层嵌套判空),推荐使用Optional。
我们在日常开发中,见到使用Optional的好像并不太多。Optional经常用于函数式编程和流式编程中。
功能 | 名称 | 返回值 | 描述 |
---|---|---|---|
创建 | empty() | Optional<T> | 创建Optional实例(空的) |
of(T t) | Optional<T> | 创建Optional实例,当t为null时抛出异常 | |
ofNullable(T t) | Optional<T> | 创建Optional实例,当t为null时返回空实例 | |
获取 | get() | T | 获取optional实例中的对象,当对象为null时报错 |
判断 | isPresent() | boolean | 判断optional是否为空,如果空则返回false;否则返回true |
ifPresent(Consumer c) | - | 如果optional不为空,则将optional中的对象传给Comsumer函数 | |
orElse(T other) | T | 如果optional不为空,则返回optional中的对象;否则返回other对象 | |
orElseGet(Supplier other) | T | 如果optional不为空,则返回optional中的对象;否则返回使用Supplier函数生成的对象 | |
orElseThrow(Supplier exception) | T | 如果optional不为空,则返回optional中的对象;否则抛出Supplier函数生成的异常 | |
过滤 | filter(Predicate p) | Optional<T> | 如果optional不为空,则执行断言函数p,如果p的执行结果为true,返回原本的optional;否则都返回空的optional |
映射 | map(Function<T, U> mapper) | Optional<U> | 如果optional不为空,则将optional中的对象t映射成另外一个对象u,并将u存放到一个新的optional容器中并返回;否则返回空的optional |
flatMap(Function< T,Optional<U>> mapper) | Optional<U> | 如果optional不为空,则将optional中的对象t映射成另外一个对象u的optional并返回;否则返回空的optional。 区别:map会自动将u放到optional中,而flatMap则需要手动给u创建一个optoptional |
static <T> Optional<T> empty()
Optional<Object> empty = Optional.empty();
static <T> Optional<T> of(T t)
Optional<String> optional = Optional.of("哈哈");
static <T> Optional<T> ofNullable(T t)
Optional<Object> optional = Optional.ofNullable(null);
T get()
Optional<String> optional = Optional.of("哈哈");
System.out.println(optional.get());
boolean isPresent()
Optional<String> optional = Optional.of("哈哈");
System.out.println(optional.isPresent());
void ifPresent(Consumer c)
Optional<String> optional = Optional.of("abc");
optional.ifPresent(str -> System.out.println(str));
T orElse(T other)
Optional<String> optional = Optional.empty();
System.out.println(optional.orElse("ccc"));
T orElseGet(Supplier other)
Optional<String> optional = Optional.empty();
System.out.println(optional.orElseGet(() ->RandomUtil.randomString(10)));
T orElseThrow(Supplier exception)
Optional<String> optional = Optional.empty();
String str = optional.orElseThrow(() -> new NullPointerException());
Optional<T> filter(Predicate p)
Optional<Integer> optional = Optional.of(10);
Optional<Integer> integer1 = optional.filter(integer -> integer > 20);
System.out.println(integer1.isPresent());
Optional<U> map(Function<T, U> mapper)
Optional<String> optional = Optional.of("10");
Optional<Integer> optional1 = optional.map(Integer::valueOf);
Optional<U> flatMap(Function< T,Optional<U>> mapper)
Optional<Integer> optional = Optional.of(10);
Optional<Integer> optional1 = optional.flatMap(str -> Optional.of(str + 1));