JAVA8新特性之Optional容器

为什么要使用Optional?

Optional是Java8提供的为了解决null安全问题的一个API。善用Optional可以使代码中很多繁琐、丑陋的设计变得十分优雅。

  • Optional.of(T t) : 创建一个 Optional 实例
Optional<Student> optional = Optional.of(new Student(1,"小张",18,60.2));
System.out.println(optional);//Optional[Student{id=1, name='小张', age=18, score=60.2}]
System.out.println(optional.get());//Student{id=1, name='小张', age=18, score=60.2}
  • Optional.empty() : 创建一个空的 Optional 实例
Optional<Student> optional = Optional.empty();
System.out.println(optional);//Optional.empty
System.out.println(optional.get());Exception in thread "main" java.util.NoSuchElementException: No value present
  • Optional.ofNullable(T t) : 若 t 不为 null,创建 Optional 实例;否则创建空实例
Optional<Object> optional = Optional.ofNullable(null);
System.out.println(optional.get());Exception in thread "main" java.util.NoSuchElementException: No value present
Optional<Object> optional2 = Optional.ofNullable("张三");
System.out.println(optional2.get());//张三
  • Optional.orElse (T t)如果创建的Optional中有值存在,则返回此值,否则返回一个默认值
Optional<String> stringOptional = Optional.of("张三");
System.out.println(stringOptional.orElse("zhangsan"));//张三

Optional<String> emptyOptional = Optional.empty();
System.out.println(emptyOptional.orElse("李四"));//李四
  • Optional.orElseGet(Supplier s) 如果调用对象包含值,返回该值,否则返回 s 获取的值,与orElse不同的是,这里返回的值是在函数中返回的,可以有更多的逻辑判断具体返回哪个值
Optional<String> stringOptional = Optional.of("张三");
System.out.println(stringOptional.orElseGet(() -> "zhangsan"));// 张三  可以通过Supplier写各种逻辑

Optional<String> emptyOptional = Optional.empty();
System.out.println(emptyOptional.orElseGet(() -> "orElseGet"));//orElseGet
  • orElseThrow(Supplier s) 如果值存在就将其值返回,否则返回一个由指定的Supplier接口生成的异常
public class Test {

    public static void main(String[] args) {
        Optional<String> op = Optional.of("张三");
        System.out.println(op.orElseThrow(CustomException::new)); //张三

        Optional<String> op2 = Optional.empty();
        System.out.println(op2.orElseThrow(CustomException::new));//Exception


    }
}
class CustomException extends RuntimeException {
    private static final long serialVersionUID = -4399699891687593264L;

    public CustomException() {
        super("业务异常");
    }

    public CustomException(String message) {
        super(message);
    }
}
  • filte(Predicate p)如果值存在并且满足提供的谓词,就返回包含该Optional对象;否则返回一个空的Optional对象
Optional<String> stringOptional = Optional.of("zhangsan");
System.out.println(stringOptional.filter(e -> e.length() > 5).orElse("王五"));
stringOptional = Optional.empty();
System.out.println(stringOptional.filter(e -> e.length() > 5).orElse("lisi"));
  • map(Function f) 如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty(),通过map将原容器中的类型映射为新容器中的类型
Optional<String> stringOptional = Optional.of("zhangsan");
System.out.println(stringOptional.map(e -> e.toUpperCase()).orElse("失败"));//ZHANGSAN

stringOptional = Optional.empty();
System.out.println(stringOptional.map(e -> e.toUpperCase()));//Optional.empty
  • flatMap(Function mapper):与 map 类似,但要求Function 的返回值必须是Optional类型
Optional<String> stringOptional = Optional.of("zhangsan");
System.out.println(stringOptional.flatMap(e -> Optional.of("lisi")).orElse("失败"));//list

stringOptional = Optional.empty();
System.out.println(stringOptional.flatMap(e -> Optional.empty());//Optional.empty
  • isPresent():判断容器中是否包含值,
Optional<Object> ofNullable = Optional.ofNullable("小翔");
if (ofNullable.isPresent()){
    System.out.println(ofNullable.get());
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值