Java 8 Optional與NullPointerException

JAVA異常類列舉了Java中部分的異常類,其中最多見的當屬NullPointerException了,程序員必須當心提防,所幸Java 8中引入了Optional類這個語法糖來更好的處理這個異常。
好比有以下三個類須要遞歸引用:java

class FirstLayer {
    private SecondLayer secondLayer;
    public SecondLayer getSecondLayer(){
        return secondLayer;
    }
}
class SecondLayer {
    private ThirdLayer thirdLayer;
    public ThirdLayer getThirdLayer() {
        return thirdLayer;
    }
}
class ThirdLayer {
    private String foo;
    public String getFoo(){
        return foo;
    }
}

以前的作法是:程序員

FirstLayer firstLayer = new FirstLayer();
if (firstLayer != null && firstLayer.getSecondLayer() != null && firstLayer.getSecondLayer().getThirdLayer() != null) {
    System.out.println(firstLayer.getSecondLayer().getThirdLayer().getFoo());
}

如今能夠:segmentfault

Optional.of(new FirstLayer()).map(FirstLayer::getSecondLayer).map(SecondLayer::getThirdLayer).map(ThirdLayer::getFoo).ifPresent(System.out::println);

在map函數內部會進行null校驗,同時這裏還使用了method reference,詳細解釋請參加:Java 8 Method Reference: How to Use it
甚至還能夠:函數

public static <T> Optional<T> resolve(Supplier<T> resolver) {
    try {
        T result = resolver.get();
        return Optional.ofNullable(result);
    } catch (NullPointerException e){
        return Optional.empty();
    }
}
FirstLayer firstLayer = new FirstLayer();
resolve(() -> firstLayer.getSecondLayer().getThirdLayer().getFoo()).ifPresent(System.out::println);
}

其中,Supplier是一種函數式接口(Functional Interface),就是一個有且僅有一個抽象方法,可是能夠有多個非抽象方法的接口。函數式接口能夠被實現爲anonymous class,更進一步能夠轉換爲lambda表達式,若是隻是調用了一個函數,還能夠用method reference。code

相關文章
相關標籤/搜索