常见的有三种方法创建Optional
创建一个为空的optional实例
@Test
public void test_create_empty_optional() {
Optional<String> empty = Optional.empty();
Assert.assertFalse(empty.isPresent());
}
用of 创建的Option实例必须为非空,用ofNullable创建的Option实例可以为空。get获取Optional的值,如果为空的话,会报NoSuchElementException
@Test
public void test_create_optional() {
Optional<String> opt = Optional.of("not empty");
Assert.assertTrue(opt.isPresent());
String res = opt.get();
System.out.println(res);
}
@Test
public void test_create_optional2() {
Optional<String> opt = Optional.ofNullable(null);
Assert.assertFalse(opt.isPresent());
System.out.println(opt.get());
}
检查值是否为空
isPresent 和 isEmpty 来查看值是否为空
@Test
public void test_present() {
Optional<String> opt = Optional.of("present");
opt.ifPresent(a -> System.out.println(a.length()));
}
orElse 和 orElseGet
orElse 和 orElseGet 源码,orElse入参是一个泛型T,orElseGet入参是一个Supplier。
public T orElse(T other) {
return value != null ? value : other;
}
public T orElseGet(Supplier<? extends T> other) {
return value != null ? value : other.get();
}
如果值为空的话,用赋予默认值
@Test
public void test_else() {
String nullName = null;
String name = Optional.ofNullable(nullName).orElse("john");
System.out.println(name);
}
@Test
public void test_elseGet() {
Supplier<String> string_supplier = new Supplier<String>() {
@Override
public String get() {
return "john";
}
};
String nullName = null;
String name = Optional.ofNullable(nullName).orElseGet(string_supplier);
System.out.println(name);
}
如果ofNullable不为空,orElse 会有value输出, orElseGet则不会有值。这是因为orElseGet是懒计算,notNullName有值,method不会被调用,而orElse则不是。
public String method() {
System.out.println("value");
return "value";
}
@Test
public void test_else() {
String notNullName = "value present";
String name = Optional.ofNullable(notNullName).orElse(method());
}
@Test
public void test_elseGet() {
String notNullName = "value present";
String name = Optional.ofNullable(notNullName).orElseGet(this::method);
}