常见的有三种方法创建Optional
创建一个为空的optional实例
@Testpublic void test_create_empty_optional() {Optional<String> empty = Optional.empty();Assert.assertFalse(empty.isPresent());}
用of 创建的Option实例必须为非空,用ofNullable创建的Option实例可以为空。get获取Optional的值,如果为空的话,会报NoSuchElementException
@Testpublic void test_create_optional() {Optional<String> opt = Optional.of("not empty");Assert.assertTrue(opt.isPresent());String res = opt.get();System.out.println(res);}@Testpublic void test_create_optional2() {Optional<String> opt = Optional.ofNullable(null);Assert.assertFalse(opt.isPresent());System.out.println(opt.get());}
检查值是否为空
isPresent 和 isEmpty 来查看值是否为空
@Testpublic 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();}
如果值为空的话,用赋予默认值
@Testpublic void test_else() {String nullName = null;String name = Optional.ofNullable(nullName).orElse("john");System.out.println(name);}@Testpublic void test_elseGet() {Supplier<String> string_supplier = new Supplier<String>() {@Overridepublic 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";}@Testpublic void test_else() {String notNullName = "value present";String name = Optional.ofNullable(notNullName).orElse(method());}@Testpublic void test_elseGet() {String notNullName = "value present";String name = Optional.ofNullable(notNullName).orElseGet(this::method);}