本文简单介绍 Java 8 中 Optional
的最经常使用法。html
建立 Optional
有三个方法,以下所示:java
// 方法1:参数不能为 null,不然会抛出异常 Optional<String> stringOptional = Optional.of("success"); // 方法2:没法肯定参数是否为 null 时,使用这个方法 Optional<String> appNameOptional = Optional.ofNullable(System.getProperty("AppName")); // 方法3:须要返回一个不含值的 Optional 对象时,使用这个方法 Optional<String> emptyOptional = Optional.empty();
注意:
Optional
对象的值是不可修改的。
判断 Optional 的值是否为空,能够用 isPresent()
方法,例如:api
Optional<String> appNameOptional = Optional.ofNullable(System.getProperty("AppName")); if (!appNameOptional.isPresent()) { System.out.println("系统属性 AppName 不存在。"); }
但 Optional
设计出来并非这么用的。标准的用法应该是用 ifPresent()
方法。以下所示:oracle
Optional.ofNullable(System.getProperty("AppName")) .ifPresent(appname -> System.out.println("AppName = " + appname));
这样的语句比 if 判断简洁的多。app
Java 8 的 Optional
类并无 ifNotPresent()
这样的方法。不过,这个遗憾 在 Java 9 中获得了补足。设计
最简单的取值方法就是 get()
方法了,不用什么例子就看得懂。但一样,Optional
设计出来并非这么用的。Optional
有更好的取值方法 orElse()
和 orElseGet()
,它们甚至用来代替 if 语句:code
// 当系统属性 AppName 不存在时,返回 "DefaultAppName" String appName = Optional .ofNullable(System.getProperty("AppName")) .orElse("DefaultAppName"); // 当缺省值须要调用另外的方法得到时,能够这样实现 String appName = Optional .ofNullable(System.getProperty("AppName")) .orElseGet(() -> getFromOtherPlace());
此外若是你但愿 Optional 为空时抛出异常,能够用 orElseThrow()
方法:htm
String appName = Optional .ofNullable(System.getProperty("AppName")) .orElseThrow(() -> new IllegalStateException("AppName is empty"));
前面提到 Optional
的值是不能够改的,但若是当前 Optional
对象的内容不是我想要的怎么办? Optional
提供了几个方便的方法,以下所示:对象
// map() 方法根据当前 Optional 的值生成一个新的 Optional Optional<String> message = Optional .ofNullable(System.getProperty("AppName")) .map(appname -> "App name is " + appname); // filter() 方法检查 Optional 的值是否知足条件,若是 // 知足则返回自身,不然返回 Optional.empty() Optional<String> message = Optional .ofNullable(System.getProperty("AppName")) .filter(appname -> appname.length() > 0);
下面是一个没有用 Optional
的例子:get
List<String> searchResults = Collections.emptyList(); String keyword = parameters.get("keyword"); if (keyword != null) { String fixedKeyword = "%" + keyword.toUpperCase() + "%"; searchResults = search(fixedKeyword); } System.out.println("搜索结果:" + searchResults.size() + " 个");
用了 Optional
以后:
List<String> searchResults = Optional .ofNullable(parameters.get("keyword")) .map(keyword -> "%" + keyword.toUpperCase() + "%") .map(fixedKeyword -> search(fixedKeyword)) .orElse(Collections.emptyList()); System.out.println("搜索结果:" + searchResults.size() + " 个");
固然,上面这个例子中,两个 map()
方法能够写在一块儿,这个能够根据本身的喜爱来了。