Java 11 已经发布好久了,而不少企业还在用很老的 Java 版本,这年头,再保守的企业也应该用上 Java 8 了。咱们不妨回顾一下 Java 8 的新(现已经是老)特性。html
类 java.util.Optional
的那些方法(method)却是没啥可讲的,看看文档就好了。这里简要列举一下:java
构造:app
static <T> Optional<T> empty() static <T> Optional<T> of(T value) static <T> Optional<T> ofNullable(T value)
Optional
的构造方法都是私有的,提供 3 个静态方法来生成 Optional
对象。其中,empty
构造一个内部不含值的 Optional
对象,of
不接受 null
,ofNullable
能够接受 null
。函数
其余方法:调试
T get() boolean isPresent() void ifPresent(Consumer<? super T> consumer) Optional<T> filter(Predicate<? super T> predicate) <U> Optional<U> map(Function<? super T, ? extends U> mapper) <U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) T orElse(T other) T orElseGet(Supplier<? extends T> other) <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X
做用分别以下:code
T get()
获取里面的值,若不存在,引起 NoSuchElementException
。htm
boolean isPresent()
检查里面是否有值。对象
void ifPresent(Consumer<? super T> consumer)
若是里面有值,则对那个值作一些处理(消费它)。文档
Optional<T> filter(Predicate<? super T> predicate)
用条件 predicate
进行过滤,条件知足则返回自己,不然返回一个不含值的 Optional<T>
。get
<U> Optional<U> map(Function<? super T, ? extends U> mapper) <U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper)
两者大同小异,都是对里面的值进行某种操做,不一样的是,flatMap
要求返回值是 Optional<U>
。
T orElse(T other) T orElseGet(Supplier<? extends T> other) <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X
这三个方法都是获取值,不一样点在于无值时三者的行为:orElse
提供一个默认值 other
,orElseGet
提供由一个函数返回的值,orElseThrow
引起一个异常。
咱们最容易想到的用法固然是 isPresent
:
Optional<String> os = Optional.ofNullable(s); if (os.isPresent()) { // 一些代码 }
但这么作没啥意义,还不如与 null
做比较直观。
Optional
也不该出如今函数的参数上,由于调用者不应有这样的心智负担。
就像这篇文章
http://www.importnew.com/22060.html
所言,咱们须要的是除了 isPresent
和 get
以外的其余方法。
例如,咱们在程序中要读取 FLUTE_DEBUG
环境变量,若是它存在,且在不区分大小写的状况下属于 "true"
、"on"
、"1"
,则认为程序处于调试模式下,不然认为处于生产模式下。
public static boolean inDebugMode() { return Optional.ofNullable(System.getenv("FLUTE_DEBUG")) .map(String::toLowerCase) .map(s -> "true".equals(s) || "on".equals(s) || "1".equals(s)) .orElse(false); }
再例如,用来实现函数的默认参数:
class MqttClientConfig { // 各个属性省略 } class MqttClient { private MqttClient() { } private static MqttClientConfig getDefaultConfig() { // 将全部的属性设为默认 // 此处从略 return new MqttClientConfig(); } public static MqttClient create(MqttClientConfig config) { // 若是 config 为 null // 则一切按照默认 MqttClientConfig theConfig = Optional.ofNullable(config).orElseGet(MqttClient::getDefaultConfig); // ...... } }
上面的代码示意了一个 MQTT 客户端建立的过程。固然,只有一个参数的方法,用这样的方式不如加一个重载,当参数多的时候,Optional
的便利才得以体现。