class Foo{
    Bar bar;
}
class Bar{
    Baz baz;
}
class Baz{
    Qux qux;
}
class Qux{
    String hoge;
}

たとえば、上記のようなクラスがあったとして、fooオブジェクトからhogeフィールドにアクセスしたい、なんていうとき。

もし、fooからquxまでひいていく途中のいずれかのフィールドがnullかもしれないとしたら、NullPointerExceptionが発生してしまう。

なので、どれもnullになる可能性があるなら、

public class Main {
	public static void main(String[] args) {
		Foo foo = getFoo();
		String hoge = (String) Optional.ofNullable(foo.bar)
						.map(t -> t.baz)
						.map(t -> t.qux)
						.map(t -> t.hoge)
						.orElse(null);
		System.out.println(hoge);
	}
}

java8 ならこう書けば安心ですね。

もうちょっとスマートに書けないかなあ。。

public class Main {
    public static void main(String[] args) {
        Foo foo = getFoo();
        String hoge = (String) get(foo.bar,(Bar t)->t.baz,(Baz t)->t.qux,(Qux t)->t.hoge);
        System.out.println(hoge);
    }

    @SuppressWarnings({ "unchecked", "rawtypes" })
    public static <T> Object get(T src, Function<?,?>... functions){
        Optional<T> optional = Optional.ofNullable(src);
        for(Function function : functions){
            optional = optional.map(function);
        }
        return optional.orElse(null);
    }
}

と思ってこんな感じで解決しました。

……mapつなげた方が分かりやすいかもw