Java8-Optional类

Class Optional

Optional 类主要解决的问题是空指针异常(NullPointerException)

Optional实际上是个容器类:它可以保存类型T的值表示这个值存在。或者仅仅保存null,表示这个值不存在。原来用null表示一个值不存在,现在Optional可以更好的表达这个概念,并且可以避免空指针异常。

  • java.util.Optional
  • 在 Java 8 之前,任何访问对象方法或属性的调用都可能导致 NullPointerException
String code = user.getAddress().getCountry().getcode().toUpperCase();

如果确保不触发异常,就得在访问每一个值之前对其进行明确地检查:

if (user != null) {
   
    Address address = user.getAddress();
    if (address != null) {
   
        Country country = address.getCountry();
        if (country != null) {
   
            String code = country.getcode();
            if (code != null) {
   
                code = code.toUpperCase();
            }
        }
    }
}

这很容易就变得冗长,难以维护。

一、方法摘要

序号 方法 & 描述
1 **static Optional empty()
**返回空的 Optional 实例。
2 boolean equals(Object obj)
判断其他对象是否等于 Optional。
3 **Optional filter(Predicate<? super predicate)
**如果值存在,并且这个值匹配给定的 predicate,返回一个Optional用以描述这个值,否则返回一个空的Optional。
4 ** Optional flatMap(Function<? super T,Optional> mapper)
**如果值存在,返回基于Optional包含的映射方法的值,否则返回一个空的Optional
5 **T get()
**如果在这个Optional中包含这个值,返回值,否则抛出异常:NoSuchElementException
6 int hashCode()
返回存在值的哈希码,如果值不存在 返回 0。
7 void ifPresent(Consumer<? super T> consumer)
如果值存在则使用该值调用 consumer , 否则不做任何事情。
8 **boolean isPresent()
**如果值存在则方法会返回true,否则返回 false。
9 **Optional map(Function<? super T,? extends U> mapper) **
如果有值,则对其执行调用映射函数得到返回值。如果返回值不为 null,则创建包含映射返回值的Optional作为map方法返回值,否则返回空Optional。
10 **static Optional of(T value)
**返回一个指定非null值的Optional。
11 **static Optional ofNullable(T value)
**如果为非空,返回 Optional 描述的指定值,否则返回空的 Optional。
12 T orElse(T other)
如果存在该值,返回值, 否则返回 other。
13 T orElseGet(Supplier<? extends T> other)
如果存在该值,返回值, 否则触发 other,并返回 other 调用的结果。
14 ** T orElseThrow(Supplier<? extends X> exceptionSupplier)
**如果存在该值,返回包含的值,否则抛出由 Supplier 继承的异常
15 **String toString()
**返回一个Optional的非空字符串,用来调试

二、Optional的创建

Optional不提供公共构造函数,所以必须采用工厂的方法加以实例化。可以通过静态的工厂方法:Optional.of()、 **Optional.ofNullable()**或者 **Optional.empty()**方法来创建Optional

1.Optional.empty():创建空对象

示例:

Optional<String> optStr = Optional.empty();

上面的示例代码调用empty()方法创建了一个空的Optional<String>对象型。

源码:

    public static<T> Optional<T> empty() {
   
        @SuppressWarnings("unchecked")
        Optional<T> t = (Optional<T>) EMPTY;
        return t;
    }

 	private static final Optional<?> EMPTY = new Optional<>();

2.Optional.of(T t):创建对象:不允许为空

Optional提供了方法of()用于创建非空对象,该方法要求传入的参数不能为空,否则抛NullPointException,示例如下:

Optional<String> optStr = Optional.of(str);  // 当str为null的时候,将抛出NullPointException

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cpOkVN5C-1604498109587)(C:\Users\xiaoyuya\AppData\Roaming\Typora\typora-user-images\1560238751082.png)]

注意:当使用 Optional 提供的静态方法 of 创建 Optional 对象时,方法的参数不能null,否则,方法会抛出 NullPointerException

源码:

public static <T> Optional<T> of(T value) {
   
        return new Optional<>(value);
    }

3.Optional.ofNulllable(T t):创建对象:允许为空

如果不能确定传入的参数是否存在null值的可能性,则可以用Optional的ofNullable()方法创建对象,如果入参为null,则创建一个空对象。示例如下:

Optional<String> optStr = Optional.ofNullable(str);  // 如果str是null,则创建一个空对象

源码:

    public static
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值