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