本内容取自官方示例,并加以小测试使用
1、Optional示例1
public static void main(String[] args) {
Optional<String> optional = Optional.of("bam");
optional.isPresent(); // true
optional.get(); // "bam"
optional.orElse("fallback"); // "bam"
optional.ifPresent((s) -> System.out.println(s.charAt(0))); // "b"
String val = null;
String val2 = Optional.ofNullable(val).orElseGet(()->getValue());//需要调用静态函数
System.out.println(val2);
String val3 = Optional.ofNullable(val).orElse("23993");//直接取值
System.out.println(val3);
}
public static String getValue(){
return "测试001";
}
2、Optional示例2
public class Optional2 {
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);
}
//Optional.of:如果传递的参数是 null,抛出异常 NullPointerException
private static void test1() {
Optional.of(new Outer())//创建对象
.flatMap(o -> Optional.ofNullable(o.nested))
.flatMap(n -> Optional.ofNullable(n.inner))//ofNullable:允许传递为 null 参数
.flatMap(i -> Optional.ofNullable(i.foo))
.ifPresent(System.out::println);//ifPresent:值存在则使用该值调用 consumer , 否则不做任何事情
}
}
3、类方法
与上段代码合并使用
public static void main(String[] args) {
test1();
test2();
test3();
}
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 <T> Optional<T> resolve(Supplier<T> resolver) {
try {
T result = resolver.get();
return Optional.ofNullable(result);
} catch (NullPointerException e) {
return Optional.empty();
}
}
更多请参考:
官方