import java.util.Optional;
import java.util.function.Supplier;
public class Optional2 {
static class Outer {
Nested nested = new Nested();
public Nested getNested() {
return nested;
}
}
static class Nested {
Inner inner = new Inner();
public Inner getInner() {
return inner;
}
}
static class Inner {
String foo = "boo";
public String getFoo() {
return foo;
}
}
public static void main(String[] args) {
test1();
test2();
test3();
}
public static <T> Optional<T> resolve(Supplier<T> resolver) {
try {
T result = resolver.get();
return Optional.ofNullable(result);
}
catch (NullPointerException e) {
return Optional.empty();
}
}
private static void test3() {
Outer outer = new Outer();
resolve(() -> outer.getNested().getInner().getFoo())
.ifPresent(System.out::println);
}
private static void test2() {
Optional.of(new Outer())
.map(Outer::getNested)
.map(Nested::getInner)
.map(Inner::getFoo)
.ifPresent(System.out::println);
}
private static void test1() {
Optional.of(new Outer())
.flatMap(o -> Optional.ofNullable(o.nested))
.flatMap(n -> Optional.ofNullable(n.inner))
.flatMap(i -> Optional.ofNullable(i.foo))
.ifPresent(System.out::println);
}
}