跳到主要内容

Optional

/**
* Optional 的关注点在它的 value 的后续处理身上,简言之,就是在值得获取上
* 而不要用它来作if-else
*/
public class OptionalTest {
public static void main(String[] args) {
//======== 创建Optional的方法 =========

//返回一个空的
Optional<String> empty = Optional.empty();
//返回非空值
Optional<String> opt = Optional.of("name");
//返回可能空也可能不空的值,内部实现就是根据传入值空或者不空,调用上面的empty和of方法
Optional<String> optional = Optional.ofNullable(name());



//======== 检查的方法 =========

//如果存在值,返回true,否则返回false
System.out.println("optional.isPresent() = " + optional.isPresent());
//如果存在值,则使用该值执行消费者
optional.ifPresent(s -> System.out.println(s));




//======== 获取值得方法 =========

//get方法
//检测是否存在,然后再获取
if (optional.isPresent()) {
System.out.println("optional.isPresent() -> optional.get() = " + optional.get());
}
//直接获取,如果没有值会报 NoSuchElementException 异常
System.out.println("optional.get() = " + optional.get());

//orElse方法
System.out.println("optional.orElse(\"default\") = " + optional.orElse("default"));

//orElseGet方法
System.out.println("optional.orElseGet(()->\"supplier\") = " + optional.orElseGet(() ->
"supplier"));

new OptionalTest().someComplexTest();

// best practice https://www.jianshu.com/p/c169ddd34903

}

private void someComplexTest() {
//TODO modify this to test
String text = "tt";
/**
* orElseGet和orElse的区别:
* orElseGet在有值得时候,后面的Supplier不会被执行
* orElse在有值的时候,后面的获取值如果是方法,依然会被执行
*/
//如果text有值,这里的Supplier是作为一个函数传入orElseGet方法,所以不会实际执行
System.out.println("Optional.ofNullable(text).orElseGet(this::getDefaultValue) = "
+ Optional.ofNullable(text).orElseGet(this::getDefaultValue));
System.out.println("=============");
//如果text有值,这里的getDefaultValue方法会先执行,计算出值,然后传入orElse方法中
System.out.println("Optional.ofNullable(text).orElse(getDefaultValue()) = "
+ Optional.ofNullable(text).orElse(getDefaultValue()));

//如果这里的getDefaultValue中的逻辑比较重,建议优先选用orElseGet方法
}

private String getDefaultValue() {
System.out.println("Getting default value");
return "default value";
}

private static String name() {
//TODO modify this to test
String name = "Java";
return name.length() > 5 ? name : null;
}
}