天天看點

JDK 8 新特性 | Optional 類

Optional<T>

類(

java.util.Optional

) 是一個容器類,代表一個值存在或不存在。原來用

null

表示一個值不存在,現在

Optional

可以更好的表達這個概念。并且可以避免空指針異常(更早的發現空指針)。

常用方法
方法 描述

static <T> Optional<T> empty()

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
傳回空的 Optional 執行個體。

boolean equals(Object obj)

判斷其他對象是否等于 Optional。

Optional<T> filter(Predicate<? super <T> predicate)

如果值存在,并且這個值比對給定的 predicate,傳回一個Optional用以描述這個值,否則傳回一個空的Optional。

<U> Optional<U> flatMap(Function<? super T,Optional<U>> mapper)

與 map 類似,要求傳回值必須是Optional

T get()

如果在這個Optional中包含這個值,傳回值,否則抛出異常:NoSuchElementException

int hashCode()

傳回存在值的哈希碼,如果值不存在 傳回 0。

void ifPresent(Consumer<? super T> consumer)

如果值存在則使用該值調用 consumer , 否則不做任何事情。

boolean isPresent()

如果值存在則方法會傳回true,否則傳回 false。

<U>Optional<U> map(Function<? super T,? extends U> mapper)

如果有值對其處理,并傳回處理後的Optional,否則傳回 Optional.empty()

static <T> Optional<T> of(T value)

傳回一個指定非null值的Optional。

static <T> Optional<T> ofNullable(T value)

如果為非空,傳回 Optional 描述的指定值,否則傳回空的 Optional。

T orElse(T other)

如果存在該值,傳回值, 否則傳回 other。

T orElseGet(Supplier<? extends T> other)

如果存在該值,傳回值, 否則觸發 other,并傳回 other 調用的結果。

<X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)

如果存在該值,傳回包含的值,否則抛出由 Supplier 繼承的異常

String toString()

傳回一個Optional的非空字元串,用來調試
代碼示例

大家可以看一下這篇文章,寫的挺好:JAVA8之妙用Optional解決NPE問題

public class TestOptional {

    @Test
    public void test1() {
        Optional<Employee> op = Optional.of(new Employee());
        Employee emp = op.get();
        System.out.println(emp);
    }

    @Test
    public void test2() {
        Optional<Employee> op = Optional.ofNullable(null);
        System.out.println(op.get());

        Optional<Employee> op2 = Optional.empty();
        System.out.println(op2.get());
    }

    @Test
    public void test3() {
        Optional<Employee> op = Optional.ofNullable(null);

        if (op.isPresent()) {
            System.out.println(op.get());
        }

        Employee emp = op.orElse(new Employee("張三"));
        System.out.println(emp);

        Employee emp2 = op.orElseGet(() -> new Employee());
        System.out.println(emp2);
    }

    @Test
    public void test4() {
        Optional<Employee> op = Optional.of(new Employee(, "張三", , ));

        Optional<String> op2 = op.map(Employee::getName);
        System.out.println(op2.get());

        Optional<String> op3 = op.flatMap((e) -> Optional.of(e.getName()));
        System.out.println(op3.get());
    }

    @Test
    public void test5() {
        Man man = new Man();

        String name = getGodnessName(man);
        System.out.println(name);
    }

    // 需求:擷取一個男人心中女神的名字
    public String getGodnessName(Man man) {
        if (man != null) {
            Godness g = man.getGod();

            if (g != null) {
                return g.getName();
            }
        }
        return "蒼老師";
    }

    // 運用 Optional的實體類
    @Test
    public void test6() {
        Optional<Godness> godness = Optional.ofNullable(new Godness("林志玲"));

        Optional<NewMan> op = Optional.ofNullable(new NewMan(godness));
        String name = getGodnessName2(op);
        System.out.println(name);
    }

    public String getGodnessName2(Optional<NewMan> man) {
        return man.orElse(new NewMan()).getGodness().orElse(new Godness("蒼老師")).getName();
    }
}
           

源碼位址:https://gitee.com/liupeifeng3514/JDK8_New_Features