markdown-it
demo
Delete
Submit
clear
permalink
### [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; } } ```
html
source
debug
Fork me on GitHub