Optional 是 Java8 中新引入的一个类,它用于作为一个值可能为 null 或 non-null 的容器对象。如果一个方法的返回值是一个 Optional 类型,这是在向我们表明该方法的返回值可能为 null,调用时需要进行判空处理,这样可以有效的防止 NullPointerException 异常。如果通过调用 Optional.isPresent() 返回 true,则表明结果 non-null,此时可以放心调用 Optional.get() 获得此对象。
of
通过调用 Optional.of 可以构造一个 Optional 对象,参数要求是 non-null 值,否则抛出 NullPointerException 异常。
1 2 3 4 5 6 7
| public static void main(String[] args) { Optional<String> optional = Optional.of("foo"); if (optional.isPresent()) { String result = optional.get(); System.out.println(result); } }
|
ofNullable
通过调用 Optional.ofNullable 可以构造一个 Optional 对象,参数如果是 null 值,则返回一个值为空的 Optional 对象。
1 2 3 4
| public static void main(String[] args) { Optional<String> optional = Optional.ofNullable(null); System.out.println(optional.isPresent()); }
|
orElse
如果 Optional 对象的值不存在,则返回 orElse 给定的值。
1 2 3 4 5
| public static void main(String[] args) { Optional<String> optional = Optional.ofNullable(null); String result = optional.orElse("foo"); System.out.println(result); }
|
ifPresent
如果 Optional 对象的值存在,则将该值作为参数执行 Consumer。否则,什么事情都不做。
1 2 3 4
| public static void main(String[] args) { Optional<String> optional = Optional.of("foo"); optional.ifPresent((s) -> System.out.println(s.length())); }
|
orElseGet
如果 Optional 对象的值存在,则直接返回该值。否则,调用 Supplier 并返回调用的结果值。
1 2 3 4 5
| public static void main(String[] args) { Optional<Date> optional = Optional.ofNullable(null); Date result = optional.orElseGet(Date::new); System.out.println(result); }
|
filter
如果 Optional 对象的值不存在或值存在且该值匹配参数给定的 Predicate 规则,则返回当前的 Optional 对象本身。否则,返回一个空的 Optional 对象。
1 2 3 4 5 6
| public static void main(String[] args) { Optional<String> optional1 = Optional.of("foo"); Optional<String> optional2 = optional1.filter((s) -> s.length() == 3); System.out.println(optional2.isPresent()); System.out.println(optional2.get()); }
|
map
如果 Optional 对象的值存在,则将该值作为参数调用 Function,如果调用的结果为 non-null 值,则返回一个新的以该结果作为值的 Optional 对象,否则,返回一个空的 Optional 对象。
1 2 3 4 5 6
| public static void main(String[] args) { Optional<String> optional1 = Optional.of("foo"); Optional<Integer> optional2 = optional1.map((s) -> s.length()); System.out.println(optional2.isPresent()); System.out.println(optional2.get()); }
|