@[toc](Java8 Optional类)
### 1、为什么有Optional类
- 避免出现空指针异常,使代码更具有可读性.
### 2、Optional类的描述
- 这是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
### 3、Optuonal类使用总结
|方法|方法描述|
|-|----|
|of(T t)|t为null时报空指针异常,否则创建一个Op实例|
|empty()|创建一个空的Op实例|
|ofNullable(T t)|t不为null时创建Op实例,否则创建空的Op实例|
|get()|如果Op有值将其返回,否则抛出NoSuchElementException|
|isPresent()|判断是否包涵值,返回boolean值|
|orElse(T t)|如果调用对象包涵值,返回该值,否则返回t|
|orElseGet(Supplier s)|如果调用对象包涵值,返回该值,否则返回s获取的值|
|map(Function f)|如果有值对其处理,并返回处理后的Op,否则返回Op.empty()|
|flatMap(Function mapper)|与map类似,要求返回值必须是Optional|
|filter(Predicate p)|如果有值且满足断言条件返回该值得Op对象,否则返回空的Op对象
==of(T t)==
```java
//工厂方法创建Optional实例
Optional<String> name = Optional.of("optional");
//传入参数为null,抛出NullPointerException.
Optional<String> someNull = Optional.of(null);
```
==empty()==
```java
//Optional.empty() : 创建一个空的 Optional 实例
Optional<Object> empty = Optional.empty();
```
==ofNullable(T t)==
```java
//创建一个值为'null'的Optional
Optional empty = Optional.ofNullable(null);
```
==get()==
```java
//执行下面的代码会输出:No value present
try {
//在空的Optional实例上调用get(),抛出NoSuchElementException
System.out.println(empty.get());
} catch (NoSuchElementException ex) {
System.out.println(ex.getMessage());}
```
==isPresent()==
```java
//isPresent() : 判断是否包含值
Optional<Employee> employees = Optional.ofNullable(null);
if(employees.isPresent()){ System.out.println("不为空");
}else{ System.out.println("为空");
}
```
==ofElse(T t)==
```java
//如果值不为null,orElse方法返回Optional实例的值。
//如果为null,返回传入的消息。
//输出:There is no value!
System.out.println(empty.orElse("There is no value !"));
//输出:optional
System.out.println(name.orElse("There is some value!"));
```
==orElseGet(Supplier s)==
```java
//orElseGet与orElse方法类似,区别在于orElse传入的是默认值
//orElseGet可以接受一个lambda表达式生成默认值。
//输出:Default Value
System.out.println(empty.orElseGet(() -> "Default Value"));
//输出:optional
System.out.println(name.orElseGet(() -> "Default Value"));
```
==orElseThrow(Supplier s)==
```java
try {
//orElseThrow与orElse方法类似。与返回默认值不同
//orElseThrow会抛出lambda表达式或方法生成的异常
empty.orElseThrow(ValueAbsentException::new);
} catch (Throwable e) {
//输出: No value present in the Optional instance
System.out.println(e.getMessage());
}
//ValueAbsentException定义class
ValueAbsentException extends Throwable {
public ValueAbsentException() {
super();
}
public ValueAbsentException(String msg) {
super(msg);
}
@Override
public String getMessage() { return "No value present in the Optional instance"; }}
```
==map(Function f)==
```java
//map方法执行传入的lambda表达式参数对Optional实例的值进行修改。
//为lambda表达式的返回值创建新的Optional实例作为map方法的返回值。
Optional<String> upperName = name.map((value) -> value.toUpperCase());
System.out.println(upperName.orElse("No value found"));
```
==flatMap(Function mapper)==
```java
//flatMap与map(Function)非常类似,区别在于传入方法的lambda表达式的返回类型。
//map方法中的lambda表达式返回值可以是任意类型,在map函数返回之前会包装为Optional。
//但flatMap方法中的lambda表达式返回值必须是Optionl实例。
upperName = name.flatMap((value) -> Optional.of(value.toUpperCase()));
System.out.println(upperName.orElse("No value found"));
//输出OPTIONAL
```
==filter(Predicate p)==
```java
//filter方法检查给定的Option值是否满足某些条件。
//如果满足则返回同一个Option实例,否则返回空Optional。
Optional<String> longName = name.filter((value) -> value.length() > 6);
System.out.println(longName.orElse("The name is less than 6 characters"));
//输出optional
```