参考文档
https://blog.csdn.net/L_Sail/article/details/78868673
调用一个方法得到了返回值却不能直接将返回值作为参数去调用别的方法。我们首先要判断这个返回值是否为null,只有在非空的前提下才能将其作为其他方法的参数。这正是一些类似Guava的外部API试图解决的问题。
新版本的Java,比如Java 8引入了一个新的Optional类。Optional类的Javadoc描述如下:
这是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
API介绍
of
为非null的值创建一个Optional。
of方法通过工厂方法创建Optional类。需要注意的是,创建对象时传入的参数不能为null。如果传入参数为null,则抛出NullPointerException 。
ofNullable
为指定的值创建一个Optional,如果指定的值为null,则返回一个空的Optional。
ofNullable与of方法相似,唯一的区别是可以接受参数为null的情况。示例如下:
empty
一个空的Optional。
isPresent
如果值存在返回true,否则返回false。
get
如果Optional有值则将其返回,否则抛出NoSuchElementException。
ifPresent
如果Optional实例有值则为其调用consumer,否则不做处理,通过ifPresent修改的值,再次通过get获取的时候不会改变
orElse
如果有值则将其返回,否则返回指定的其它值。
如果Optional实例有值则将其返回,否则返回orElse方法传入的参数。
orElseGet
orElseGet与orElse方法类似,区别在于得到的默认值。orElse方法将传入的字符串作为默认值,orElseGet方法可以接受Supplier接口的实现用来生成默认值。
orElseThrow
如果有值则将其返回,否则抛出supplier接口创建的异常。
在orElseGet方法中,我们传入一个Supplier接口。然而,在orElseThrow中我们可以传入一个lambda表达式或方法,如果值不存在来抛出异常。
map
如果有值,则对其执行调用mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional。
代码示例
package cn.taobao;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Supplier;
public class ah {
public static void main(String[] args) {
//调用工厂方法创建Optional实例
Optional<String> s1 = Optional.of("小明");
//传入参数为null,抛出NullPointerException.
// Optional<String> someNull = Optional.of(null);
//下面创建了一个不包含任何值的Optional实例
//例如,值为'null'
Optional empty_1 = Optional.ofNullable(null);
Optional<String> empty_2 = Optional.empty();
//true
System.out.println(empty_1.equals(empty_2));
//isPresent方法用来检查Optional实例中是否包含值
//小明
if (s1.isPresent()) {
//在Optional实例内调用get()返回已存在的值
System.out.println(s1.get());
}
//hello 小明
s1.ifPresent(new Consumer<String>() {
@Override
public void accept(String s) {
s="hello "+s;
System.out.println(s);
}
});
//空
Object kong = empty_1.orElse("空");
System.out.println(kong);
//小明
String kong1 = s1.orElse("kong");
System.out.println(kong1);
//又是空
Object o = empty_1.orElseGet(new Supplier() {
@Override
public Object get() {
return "又是空";
}
});
System.out.println(o);
//小明
String s = s1.orElseGet(() -> "我不是空");
System.out.println(s);
/*
演示map
*/
List<Integer> list_1 = Arrays.asList(1, 3, 5, 7, 9);
Optional<List<Integer>> optionalList_1 = Optional.ofNullable(list_1);
Optional<ArrayList<Integer>> optionalList_2 = optionalList_1.map(xx -> {
ArrayList<Integer> objects = new ArrayList<>();
for (int i = 0; i < xx.size(); i++) {
objects.add(xx.get(i) * 2);
}
return objects;
});
ArrayList<Integer> list_2 = optionalList_2.get();
//[2, 6, 10, 14, 18]
System.out.println(list_2);
}
}