JDK8新特性-Optional 浅谈

一、之前对NULL的处理

@Test
public void test1(){
    String userName = null;
    if(userName != null){
        //对应处理
    }else{
        //对应处理
    }
}




//多级的Null值判断-通常方式
@Test
public void test2(){

    TbUser user = userMapper.getbyName("张三");
    
    if(user == null)
        //对应处理
    else
        //对应处理

    Address address = user.getAddress();   
      
     if(address == null )
        //对应处理
     else
        //对应处理 

    String  homeAddr =  address.getHomeAddr();   
    
}


//多级Null值判断-Optional方法

@Test
public void test2(){

    TbUser user = userMapper.getbyName("张三");
    
    Optional<String> = Optional.ofNullable(userMapper.getByName("张三"))
                               .map(User::getAddress)
                               .map(Adderss::getHomeAddr)
                               .orElseThrow(()->new RunTimeException("查询地址失败 --> 中间过程出现Null值"));

}

二、Optional类

Optional 是 Java 8 引入的一个类,用于解决空指针异常(NullPointerException)的问题。它的设计目的是为了提供一种更好的方式来处理可能为空的对象。

在传统的 Java 编程中,如果一个方法可能返回 `null`,那么调用该方法后就需要进行空值检查,以免引发空指针异常。这样的代码通常会显得冗长并且容易出错。

使用 `Optional` 可以改善这个问题。`Optional` 可以将可能为空的对象包装起来并提供一系列的操作方法,这些方法可以用来处理包装对象为空的情况,避免直接操作空引用导致的异常。

下面是一些使用 `Optional` 的常见场景和好处:

        1. 避免空指针异常:通过将可能为空的对象包装在 `Optional` 中,可以避免直接操作 null 对象而导致的空指针异常。

        2. 明确标识可能为空的返回值:某些方法可能返回一个空值,使用 `Optional` 作为方法返回类型可以清晰地表明这一点。

        3. 减少空值检查和条件判断:使用 `Optional` 提供的方法可以简化对包装对象是否为空的判断,减少冗长的空值检查代码。

        4. 支持流式操作:`Optional` 提供了一些便利的方法,可以在不引发空指针异常的情况下对包装对象进行流式操作,例如 `map`、`filter`、`orElse` 等。

总而言之,`Optional` 提供了一种更加优雅和安全的方式来处理可能为空的对象,避免了空指针异常,并且可以简化代码逻辑。然而,需要注意的是,在使用 `Optional` 时要谨慎选择合适的场景,并避免过度使用,以免增加代码复杂性。

 

三、Optional的基本使用

1.Optional对象的创建方式

/*
    Optional对象的创建方式
*/


@Test
public void test02(){

    //1.通过of方法.of方法是不支持null的
    Option<String> op1 = Optional.of("zhangsan");
    Option<Object> op2 = Optional.of(null); //此时会报空指针

    //2.通过 ofNullable方法 支持null
    Optional<String> op3 = Optional.ofNullable("lisi");
    Option<Object> op4 = Optional.ofNullable(null) //此时不会报异常

    //3.通过empty方法直接创建一个空的Optional对象
    Optional<Object> op5 = Optional.empty(); 

}

2.Optional的常用方法

(1).get( )与isPresent( )方法

/*
    get():如果Optional有返回值则返回,否则抛出NoSuchElementException异常
        get()方法通常和isPresent()方法一块使用
    isPresent():判断是否包含值,如果包含值就返回true,如果不包含值就返回false

*/


@Test
public void testGet(){

    Optinal<String> op1 = Optional.of("zhangsan");
    Optional<String>  op2 = Optional.empty();


    //获取Optional中的值
    if(op1.isPresent())
          System.out.println("用户名称" + op1.get());





    //获取Optional中的值
    if(op2.isPresent())
          System.out.println("用户名称" + op2.get());
    else
        System.out.println("这是一个空Optional对象" );
    
}
(2) orElse(T t) 、orElseGet(Supplier<T ? super> s)、orElseThrow(Supplier<T ? super> s)
/*
    orElse(T t):如果调用对象不为null,就返回原本的值,否则返回t
    orElseGet(Supplier<T ? super> s) :如果对象不为null,就返回原本的值,否则就会返回Supplier接口中的Lambda表达式的返回值
    orElseThrow(Supplier<T ? super> s)::如果对象不为null,就返回原本的值,否则会抛出异常
*/



@Test
public void test1(){

     Optinal<String> op1 = Optional.of("zhangsan");
     Optional<String>  op2 = Optional.empty();

    //orElse()   
    String name1 = op1.orElse("lisi");  // -->zhangsan
    String name2 = op2.orElse("wangwu"); // --> wangwu


    //orElseGet(Supplier<T ? super> s)
    String name3 = op2.orElseGet(()-> "hello"); // --> Hello


    //orElseThrow(Supplier<T ? super> s)
    String name4 = op2.orElseThrow(()->new RunTimeException("值不允许为Null"));
    

}
(3) ifPresent(Consumer c)
/*
    ifPresent(Consumer c)如果有值就做什么,参数是一个Consumer接口
*/

@Test
public void test4(){
    Optional<String> op1 = Optional.of("zhangsan");
    Optional<String> op2 = Optional.empty();

    op1.ifPresent(ss -> System.out.println("获取到值"+ss));

}


(4)map()
/*
    map()类似于与Stream流中的map(), 用map 将Optional中判断的对象替换成下级对象,如果在此过程中出现NUll 则判断为null。

*/

@Test
public void test1(){
    Optional<String> = Optional.ofNullable(new Person("zhangsan",13))
                               .map(Person::getName)
                               .orElse("查无此人") 

}



@Test
public void test1(){
    Optional<String> = Optional.ofNullable(new Person("zhangsan",13))
                               .map(Person::getName)
                               .map(String::toUppercase)
                               .orElse("查无此人")

}

以上是对Optional的浅谈 后续还会补充深入

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值