package java.util; import ...... public final class Optional < T > { private static final Optional << ? > EMPTY = new Optional < > (); private final T value; private Optional() { this.value = null; } public static < T > Optional < T > empty() { @SuppressWarnings("unchecked") Optional < T > t = (Optional < T > ) EMPTY; return t; } private Optional(T value) { this.value = Objects.requireNonNull(value); } public static < T > Optional < T > of (T value) { return new Optional < > (value); } public static < T > Optional < T > ofNullable(T value) { return value == null ? empty() : of (value); } public T get() { if (value == null) { throw new NoSuchElementException("No value present"); } return value; } public boolean isPresent() { return value != null; } public void ifPresent(Consumer << ? super T > consumer) { if (value != null) consumer.accept(value); } public Optional < T > filter(Predicate << ? super T > predicate) { Objects.requireNonNull(predicate); if (!isPresent()) return this; else return predicate.test(value) ? this : empty(); } public < U > Optional < U > map(Function << ? super T, ? extends U > mapper) { Objects.requireNonNull(mapper); if (!isPresent()) return empty(); else { return Optional.ofNullable(mapper.apply(value)); } } public < U > Optional < U > flatMap(Function << ? super T, Optional < U >> mapper) { Objects.requireNonNull(mapper); if (!isPresent()) return empty(); else { return Objects.requireNonNull(mapper.apply(value)); } } public T orElse(T other) { return value != null ? value : other; } public T orElseGet(Supplier << ? extends T > other) { return value != null ? value : other.get(); } public < X extends Throwable > T orElseThrow(Supplier << ? extends X > exceptionSupplier) throws X { if (value != null) { return value; } else { throw exceptionSupplier.get(); } } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (!(obj instanceof Optional)) { return false; } Optional << ? > other = (Optional << ? > ) obj; return Objects.equals(value, other.value); } @Override public int hashCode() { return Objects.hashCode(value); } @Override public String toString() { return value != null ? String.format("Optional[%s]", value) : "Optional.empty"; } }
//聲明一個空的Optional Optional<Car> optCar = Optional.empty();
/**
*依據一個非空值建立Optional.
*若是car是一個null,這段代碼會當即拋出一個NullPointerException,而不是等到你 試圖訪問car的屬性值時才返回一個錯誤
*/
Optional<Car> optCar = Optional.of(car)
//可接受null的Optional Optional<Car> optCar = Optional.ofNullable(car);
方法java |
描述app |
---|---|
emptyide |
返回一個空的 Optional 實例函數 |
filterui |
若是值存在而且知足提供的謂詞,就返回包含該值的 Optional 對象;不然返回一個空的 Optional 對象this |
flatMapspa |
若是值存在,就對該值執行提供的 mapping 函數調用,返回一個 Optional 類型的值,不然就返回一個空的 Optional 對象code |
get | 若是該值存在,將該值用 Optional 封裝返回,不然拋出一個 NoSuchElementException 異常orm |
ifPresent | 若是值存在,就執行使用該值的方法調用,不然什麼也不作對象 |
isPresent |
若是值存在就返回 true,不然返回 false |
map |
若是值存在,就對該值執行提供的 mapping 函數調用 |
of |
將指定值用 Optional 封裝以後返回,若是該值爲 null,則拋出一個 NullPointerException 異常 |
ofNullable |
將指定值用 Optional 封裝以後返回,若是該值爲 null,則返回一個空的 Optional 對象 |
orElse |
若是有值則將其返回,不然返回一個默認值 |
orElseGet |
若是有值則將其返回,不然返回一個由指定的 Supplier 接口生成的值 |
orElseThrow |
若是有值則將其返回,不然拋出一個由指定的 Supplier 接口生成的異常 |
1.ifPresent
Optional<User> user = Optional.ofNullable(getUserById(id)); user.ifPresent(u -> System.out.println("Username is: " + u.getUsername()));
2.orElse
若是 Optional
中有值則將其返回,不然返回 orElse
方法傳入的參數。
User user = Optional .ofNullable(getUserById(id)) .orElse(new User(0, "Unknown")); System.out.println("Username is: " + user.getUsername());
3.orElseGet
orElseGet
與 orElse
方法的區別在於,orElseGet
方法傳入的參數爲一個 Supplier
接口的實現 —— 當 Optional
中有值的時候,返回值;當 Optional
中沒有值的時候,返回從該 Supplier
得到的值。
User user = Optional .ofNullable(getUserById(id)) .orElseGet(() -> new User(0, "Unknown")); System.out.println("Username is: " + user.getUsername());
4.orElseThrow
orElseThrow
與 orElse
方法的區別在於,orElseThrow
方法當 Optional
中有值的時候,返回值;沒有值的時候會拋出異常,拋出的異常由傳入的 exceptionSupplier 提供。
User user = Optional .ofNullable(getUserById(id)) .orElseThrow(() -> new EntityNotFoundException("id 爲 " + id + " 的用戶沒有找到"));