wiki
这是一个可以为null
的容器对象。如果值存在则isPresent()
方法会返回true
,调用get()
方法会返回该对象
1. 方法
1. 创建
of(T t)
: 为非null
的值创建一个Optional
。如果传入参数为null
,则抛出NullPointerException
。
empty()
: 创建一个空的 Optional
实例。
ofNullable(T t)
: 为指定的值创建一个Optional
,不为 null 时调用 of(T t)
,否则调用 empty()
。
2. 实例方法
get()
: 如果Optional
有值则将其返回,否则抛出NoSuchElementException
。
isPresent()
: 如果值存在返回true
,否则返回false
。
ifPresent(Consumer<? super T> consumer)
: 如果 Optional
实例有值则为其调用 consumer
,否则不做处理。
orElse(T t)
: 如果有值则将其返回,否则返回指定的 T 值。
orElseGet(Supplier s)
: 与orElse
方法类似,区别在于得到的默认值。orElse
方法将传入的字符串作为默认值,orElseGet
方法可以接受Supplier
接口的实现用来生成默认值。
orElseThrow(Supplier s)
: 如果有值则将其返回,否则抛出supplier
接口创建的异常。
map(Function f)
: 如果有值,则对其执行调用mapping
函数得到返回值。如果返回值不为null
,则创建包含mapping
返回值的Optional
作为map
方法返回值,否则返回空Optional
。
flatMap(Function mapper)
: 如果有值,为其执行mapping
函数返回Optional
类型返回值,否则返回空Optional
。map
方法的mapping
函数返回值可以是任何类型T
,而flatMap
方法的mapping
函数必须是Optional
。
filter(Predicate p)
: 如果有值并且满足断言条件返回包含该值的Optional
,否则返回空Optional
。
2. 实战
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
Optional<String> name = Optional.of("hello");
Optional empty = Optional.empty();
Optional nullable = Optional.ofNullable(null);
if (name.isPresent()) { System.out.println(name.get()); }
try { System.out.println(empty.get()); } catch (NoSuchElementException ex) { System.err.println(ex.getMessage()); }
name.ifPresent((value) -> { System.out.println("The length of the value is: " + value.length()); });
System.out.println(empty.orElse("There is no value present!")); System.out.println(name.orElse("There is some value!"));
System.out.println(empty.orElseGet(() -> "Default Value")); System.out.println(name.orElseGet(String::new));
try { empty.orElseThrow(IllegalArgumentException::new); } catch (Throwable ex) { System.out.println("error:" + ex.getMessage()); }
Optional<String> upperName = name.map((value) -> value.toUpperCase()); System.out.println(upperName.orElse("No value found"));
upperName = name.flatMap((value) -> Optional.of(value.toUpperCase())); System.out.println(upperName.get());
List<String> names = Arrays.asList("YanWei","YanTian"); for(String s:names) { Optional<String> nameLenLessThan7 = Optional.of(s).filter((value) -> value.length() < 7); System.out.println(nameLenLessThan7.orElse("The name is more than 6 characters")); }
|