Optional

说明

  1. Optional类是一个可以为null的容器对象,java8首次提供。
  2. Optional是个容器,将具体的对象放置其中,按照网上说法,可以优雅处理null问题,包括常见的空指针异常。
  3. 在代码中引用Optional,代码会更漂亮,但个人感觉使用的时候,不够直接,不如原始写法舒畅,另在代码逻辑中,通常判断为null时,需要return操作,在这个场景下,感觉Optional类体现不出优势,但对于有为空设置默认值的场景,Opional类确实比较好用。
  4. Opional类中的一些方法,我个人尚未理解。比如map,flatmap,filter方法,将处理逻辑放置其中,在功能归属上是不是合理?
  5. 以上仅个人看法。

方法

isPresent

  • 是否存在
  • 判断容器内的对象是否为null
        Integer a = 1;
        Integer b = null;
        Optional<Integer> oa = Optional.of(a); //of 方法不允许参数为null
        Optional<Integer> ob = Optional.ofNullable(b); //ofNullable 方法允许传递null, 当参数为null时,等价于Optional.empty()
        System.out.println(oa.isPresent()?"a 不为空":"a 为空");
        System.out.println(ob.isPresent()?"b 不为空":"b 为空");

结果

a 不为空
b 为空

get/orElse/orElseGet/orElseThrow

  • 获取容易内对象
  • 容器内对象不为null时,返回该对象,否则按方法规则做不同的处理
        Integer a = 1;
        Integer b = null;
        Optional<Integer> oa = Optional.of(a);
        Optional<Integer> ob = Optional.ofNullable(b);
        // 容器内对象为空时,会抛出异常,用于确认容器内对象不为空时的取值
        a = oa.get();
        // 容器内对象为空时,返回参数的值,否则返回容器内对象
        b = ob.orElse(7);
        System.out.println(a);
        System.out.println(b);
        // 参数为一个实现Supplier接口的类,需要实现接口中的get方法
        // 容器内对象为空时,返回由参数生成的值,否则返回容器内对象
        Integer c = ob.orElseGet(() -> 9);
        System.out.println(c);
        // 参数为一个实现Supplier接口的类,需要实现接口中的get方法,返回一个异常
        // 容器内对象为空时,抛出一个参数生成的自定义的异常,否则返回容器内对象,参数为空时,抛出Exception
        Integer d = ob.orElseThrow(() -> new RuntimeException("null exception"));
        System.out.println(d);

结果

1
7
9
Exception in thread "main" java.lang.RuntimeException: null exception
	at com.qinsy.sample.OptionalExecutor.lambda$getAndOrElse$1(OptionalExecutor.java:55)
	at java.base/java.util.Optional.orElseThrow(Optional.java:403)
	at com.qinsy.sample.OptionalExecutor.getAndOrElse(OptionalExecutor.java:55)
	at com.qinsy.sample.OptionalExecutor.main(OptionalExecutor.java:10)

ifPresent

  • 如果存在
  • 如果值存在则使用该值调用参数内方法, 否则不做任何事情。
        Integer a = 1;
        Integer b = null;
        Optional<Integer> oa = Optional.of(a);
        Optional<Integer> ob = Optional.ofNullable(b);
        oa.ifPresent(System.out::println);
        ob.ifPresent(System.out::println);

结果

1

map

  • 映射
  • 如果值为null,或通过映射后的值为null,返回包含映射返回值的Optional对象,否则返回空Optional
        String str = "abc";
        Optional os = Optional.ofNullable(str).map(String::length);
        System.out.println(os.orElse("none")); // 因为没有指定Optional的类型,故此处类型为Object,所以不会出类型错误

结果

3

flatMap

  • 映射
  • 如果值为null,或通过映射后的值为null,返回包含映射返回值的Optional对象,否则返回空Optional。与map方法类似,二者参数不同,map的参数为映射方法,flatMap的参数是包含映射方法的Optional
        String str = "abc";
        Optional os = Optional.of(str).flatMap(s -> Optional.ofNullable(s.length()));
        System.out.println(os.orElse("none"));

结果

3

filter

  • 是否存在
  • 如果值存在,并且这个值匹配给定的predicate,返回包含该值的Optional,否则返回一个空的Optional
        String str = "abc";
        Optional os = Optional.of(str).filter(s -> s.length() > 2);
        System.out.println(os.orElse("none"));

结果

abc
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值