一、簡介
Optional 類是一個可以為null的容器對象。如果值存在則isPresent()方法會返回true,調用get()方法會返回該對象。
Optional 是個容器:它可以保存類型T的值,或者僅僅保存null。Optional提供很多有用的方法,這樣我們就不用顯式進行空值檢測。
Optional 類的引入很好的解決空指針異常。
二、代碼舉例
import bean.User; import lombok.extern.slf4j.Slf4j; import org.junit.Test; import java.util.*; @Slf4j public class OptionalDemo { public List<User> getList() { List<User> users = new ArrayList<>(); User user = new User("Tom", 22, "Street #1"); users.add(user); users.add(new User("Michael", 33, "Street #2")); users.add(new User("Lily", 25, "Street #3")); return users; } @Test public void testOptional() { List<User> users = getList(); User user = users.get(0); /*判斷是否為空*/ Optional<User> optional = Optional.of(user); log.info("optional.isPresent(): " + optional.isPresent()); /*不確定是否為null*/ User user2 = null; Optional<User> optional2 = Optional.ofNullable(user2); log.info("optional2.isPresent(): " + optional2.isPresent()); /*數據為null時給默認值*/ log.info("optional3.orElse(): " + Optional.ofNullable(user2).orElse(user)); // 通過函數獲取默認值,不為空時不執行 // log.info("optional3.orElseGet(): " + Optional.ofNullable(user).orElseGet(createUser())); // 為null時,拋出指定的異常 // log.info("optional3.orElseGet(): " + Optional.ofNullable(user2).orElseThrow(() -> new IllegalArgumentException("數值不能為空!"))); // 對單個值進行處理 users.stream().map(x -> x.getName()).forEach(x -> System.out.println("map:" + x)); // 拆分為多個值分別處理 users.stream().flatMap(x -> Arrays.stream(x.getName().split("o"))).forEach(x -> System.out.println("flatMap:" + x)); } @Test public void testComparator() { List<User> users = getList(); /*查詢年齡最大的人*/ Optional<User> max = users.stream().max(Comparator.comparing(User::getAge)); log.info("maxAge: " + max.get().toString()); /*名字最長的人*/ Optional<String> max2 = users.stream().map(u -> u.getName()).max(Comparator.comparing(String::length)); log.info("maxStringLength: " + max2.get()); } }
運行結果:
#testOptional 19:50:34.588 [main] INFO java8.optional.OptionalDemo - optional.isPresent(): true 19:50:34.588 [main] INFO java8.optional.OptionalDemo - optional2.isPresent(): false 19:50:34.588 [main] INFO java8.optional.OptionalDemo - optional3.orElse(): User[name='Tom', age=22, address='Street #1'] map:Tom map:Michael map:Lily flatMap:T flatMap:m flatMap:Michael flatMap:Lily #testComparator 19:50:34.576 [main] INFO java8.optional.OptionalDemo - maxAge: User[name='Michael', age=33, address='Street #2'] 19:50:34.586 [main] INFO java8.optional.OptionalDemo - maxStringLength: Michael