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