### [Optional](http://blog.tonycube.com/2015/10/java-java8-4-optional.html)
```java
import java.util.Optional;
import java.util.stream.Stream;
// ...
Optional<String> first = Stream.of(new String[] {"A", "B", "C", "D"}).findFirst();
System.out.println(first.get()); // A
Optional<String> op = Optional.ofNullable(employee.getName());
String nana = op.orElse("Non");
String meme = op.orElseThrow(() -> new MyException("WHAT! NULL!"));
System.out.println(op.orElseGet(() -> "WHAT! null!"));
first.isPresent() // null != first
```
#### [How to Get the Last Element of a Stream in Java?](https://www.baeldung.com/java-stream-last-element)
```java
// Using the Reduce API
Optional<String> last = stream.reduce((first, second) -> second);
// Using the Skip Function
Optional<String> last = stream.skip(count - 1).findFirst();
// reduce for sum all item
System.out.println(integers.stream().reduce(0, (a, b) -> a + b));
```
### 使用 `ifPresent`
`ifPresent` 方法接受一個 `Consumer` 介面的實例,當 `Optional` 包含值時,該值將被提供給 `Consumer` 實例,並執行相應的操作。如果 `Optional` 是空的,則不執行任何操作。
```java
Optional<String> optionalValue = Optional.of("Hello, World!");
optionalValue.ifPresent(value -> {
System.out.println("Value is present: " + value);
});
// 如果 optionalValue 是空的,上述代碼不會執行任何操作
```
### 使用 `ifPresentOrElse`
`ifPresentOrElse` 方法允許你同時指定當 `Optional` 包含值時和不包含值時的操作。它接受兩個參數:一個 `Consumer` 介面的實例,用於處理值的情況,以及一個 `Runnable` 介面的實例,用於處理空值的情況。
```java
Optional<String> optionalValue = Optional.of("Hello, World!");
optionalValue.ifPresentOrElse(
value -> {
System.out.println("Value is present: " + value);
},
() -> {
System.out.println("Value is not present.");
}
);
// 如果 optionalValue 是空的,執行第二個 Runnable 的代碼
```
上述例子中,如果 `optionalValue` 包含值,則執行第一個 `Consumer` 的代碼,否則執行第二個 `Runnable` 的代碼。
使用這兩種方法可以更方便地處理可能為空的情況,並簡化代碼。
```java
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public class Main {
public static void main(String[] args) {
Some some = new Some(new Data(new ArrayList<>()));
//some = new Some(new Data(null));
//some = new Some(null);
//some = null;
Optional.ofNullable(some)
.map(Some::getData) // 檢查 some 是否為 null,然後取得 data
.map(Data::getList) // 檢查 data 是否為 null,然後取得 list
.ifPresentOrElse(
list -> {
// 對 list 做相應的操作
System.out.println("List content: " + list);
},
() -> {
// 如果任一層級為空,執行這裡的代碼
System.out.println("List or its parent objects are null.");
}
);
}
}
class Some {
private Data data;
public Some(Data data) {
this.data = data;
}
public Data getData() {
return data;
}
}
class Data {
private List<String> list;
public Data(List<String> list) {
this.list = list;
}
public List<String> getList() {
return list;
}
}
```
```
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public class Main {
public static void main(String[] args) {
System.out.println(Optional.ofNullable(new Some(new Data(new ArrayList<>())))
.map(Some::getData) // 檢查 some 是否為 null,然後取得 data
.map(Data::getList) // 檢查 data 是否為 null,然後取得 list
.map(Object::toString)
.orElse("EMPTY")); // Output: []
System.out.println(Optional.ofNullable(new Some(new Data(null)))
.map(Some::getData) // 檢查 some 是否為 null,然後取得 data
.map(Data::getList) // 檢查 data 是否為 null,然後取得 list
.map(Object::toString)
.orElse("EMPTY")); // Output: EMPTY
System.out.println(Optional.ofNullable(new Some(null))
.map(Some::getData) // 檢查 some 是否為 null,然後取得 data
.map(Data::getList) // 檢查 data 是否為 null,然後取得 list
.map(Object::toString)
.orElse("EMPTY")); // Output: EMPTY
Some some = null;
System.out.println(Optional.ofNullable(some)
.map(Some::getData) // 檢查 some 是否為 null,然後取得 data
.map(Data::getList) // 檢查 data 是否為 null,然後取得 list
.map(Object::toString)
.orElse("EMPTY")); // Output: EMPTY
}
}
class Some {
private Data data;
public Some(Data data) {
this.data = data;
}
public Data getData() {
return data;
}
}
class Data {
private List<String> list;
public Data(List<String> list) {
this.list = list;
}
public List<String> getList() {
return list;
}
}
```