# Optional 相關

Optional是Java SE 8中的一个新特性，它提供了一种优雅的方式来处理可能为空的值，避免了空指针异常的问题。

Optional类提供了以下常用方法：

<div id="bkmrk-of%28%29%EF%BC%9A%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E5%8C%85%E5%90%AB%E6%8C%87%E5%AE%9A%E9%9D%9E%E7%A9%BA%E5%80%BC%E7%9A%84opt"><div>- of()：创建一个包含指定非空值的Optional对象。如果传入null，则会抛出NullPointerException异常。例如：

```Java
Optional<String> optional = Optional.of("hello");<br></br>
```

- empty()：创建一个空的Optional对象。例如：

```Java
Optional<String> optional = Optional.empty();<br></br>
```

- isPresent()：判断Optional对象是否包含非空值。例如：

```
Optional<String> optional = Optional.of("hello");<br></br>if (optional.isPresent()) {<br></br>    System.out.println("value is present: " + optional.get());<br></br>}<br></br>
```

- get()：获取Optional对象中的值，如果对象为空则抛出NoSuchElementException异常。例如：

```Java
Optional<String> optional = Optional.of("hello");<br></br>String value = optional.get();<br></br>System.out.println("value: " + value);<br></br>
```

- orElse()：获取Optional对象中的值，如果对象为空则返回指定的默认值。例如：

```Java
Optional<String> optional = Optional.empty();<br></br>String value = optional.orElse("default");<br></br>System.out.println("value: " + value);<br></br>
```

- map()：对Optional对象中的值进行映射操作，返回一个新的Optional对象。例如：

```Java
Optional<String> optional = Optional.of("hello");<br></br>Optional<Integer> result = optional.map(s -> s.length());<br></br>System.out.println("result: " + result.get());<br></br>
```

- filter()：对Optional对象中的值进行过滤操作，返回一个新的Optional对象。例如：

```Java
Optional<String> optional = Optional.of("hello");<br></br>Optional<String> result = optional.filter(s -> s.startsWith("h"));<br></br>System.out.println("result: " + result.get());<br></br>
```

</div></div>  
需要注意的是，对Optional对象的操作通常采用链式调用的方式，如下所示：

```Java
Optional<String> optional = Optional.of("hello");
String result = optional.map(s -> s.toUpperCase())
                      .orElse("default");
System.out.println("result: " + result);

```

<div id="bkmrk-"></div><div id="bkmrk-%E5%9C%A8%E4%B8%8A%E9%9D%A2%E7%9A%84%E7%A4%BA%E4%BE%8B%E4%B8%AD%EF%BC%8C%E6%88%91%E4%BB%AC%E9%A6%96%E5%85%88%E5%B0%86%E5%AD%97%E7%AC%A6%E4%B8%B2%22hel"><div>在上面的示例中，我们首先将字符串"hello"包装成Optional对象，然后使用map()方法将字符串转换成大写，最后使用orElse()方法获取处理结果，如果对象为空则返回指定的默认值"default"。</div></div>---

<div id="bkmrk--1"></div><div id="bkmrk--2"></div>`optional.isPresent()`方法用于检查`Optional`对象是否包含非空值，如果对象中包含了一个非空的值，则返回`true`，否则返回`false`。

如果使用`Optional.of()`方法创建一个`Optional`对象时，传入了一个空引用，则会抛出`NullPointerException`异常，而不是返回一个包含空值的`Optional`对象。因此，如果使用`Optional.of()`方法创建的`Optional`对象中包含了一个空引用，则调用`optional.isPresent()`方法会返回`false`，而不是检查空字符串。

如果需要检查一个空字符串，可以使用`Optional.ofNullable()`方法创建一个`Optional`对象，例如：

```Java
String str = "";
Optional<String> optional = Optional.ofNullable(str);
if (optional.isPresent()) {
    System.out.println("str is not empty");
} else {
    System.out.println("str is empty");
}

```

在上面的示例中，我们首先使用一个空字符串创建一个`Optional`对象，然后使用`optional.isPresent()`方法检查字符串是否为空。由于字符串为空，因此调用`optional.isPresent()`方法会返回`false`，所以最终输出结果为"str is empty"。