#Optionalhtml
##Optional简述java
按照字面意思的理解,应该可选的意思。一开始我还觉得是相似python里面的默认参数用法呢,结果语义是指某个值可能有也可能没有(null)。 感受名字取得不是很直观。。我以为叫Nullable不是更好?python
python:程序员
def fn(a='default_value'): print(a) pass
##Optional方法api
Optional没有公开的构造方法,只有静态工厂方法:app
Optional<String> optional_2 = Optional.of(str); // 若是str == null,抛出错误NullPointerException Optional<String> optional = Optional.ofNullable(str); // 若是str == null,返回一个空Optional<String> Optional.<String>empty(); // 返回一个空Optional<String> String s = optional.get(); //获取被包装的值 optional.ifPresent((value) -> System.out.println("hello")); // 若是optional的value不是null,则执行函数表达式 optional.orElse("elseValue"); // 若是optional的value为null,则返回"elseValue" optional.orElseGet(() -> "orElseGet"); // 若是optional的value不是null,则返回函数表达式的执行结果 optional.orElseThrow(RuntimeException::new); // 若是optional的value不是null,则抛出错误 optional.filter((value) -> value.length() == 5); // 过滤获得长度等于5的value optional.map((value) -> { System.out.println("map:" + value); return value; }); optional.flatMap((value) -> { System.out.println("flatMap:" + value); return Optional.ofNullable(value); });
###map 与 flatMap 的区别函数
map(mapper) 与 flatMap(mapper) 功能上基本是同样的,只是最后的返回值不同。map(mapper)方法里面的mapper能够返回任意类型,可是flatMap(mapper)方法里面的只能返回Optional类型。code
若是mapper返回结果result的不是null,那么map就会返回一个Optional<Object>,可是 flatMap 不会对result进行任何包装。一个常见的例子:htm
Optional<String> os; os.map((value)->Optional.of(value)) //返回的类型是Optional<Optional<String>> os.flatMap((value)->Optional.of(value)) //返回的类型是Optional<String>
##Optional的好处对象
显式的提醒你须要关注null的状况,对程序员是一种字面上的约束
将平时的一些显式的防护性检测给标准化了,并提供一些可串联操做
解决一下null会致使疑惑的概念,好比Map里面的key==null的状况,以及value==null的状况
##小节 不过Optional一会儿有这么多方法,Optional的初衷是什么?并且Optional也是一个对象,因此它自己也有多是null,这可如何是好。
因此,有个观点认为,Optional比较适用的地方是做为返回值,这样能够给使用者一个善意的提醒。
##参考