JAVA8新特性(四)

Optional

java开发中我们最常见的异常大概就是空指针异常NullPointerException。

出现空指针异常的情况:

  1. 空对象调用方法,示例:
    private static void test1(List<Apple> appleList){
        Apple apple = appleList.get(0);
        System.out.println(apple.toString());
    }
    
    此时appleList作为参数传递过来的,如果不判断是不是null,直接调用方法就会出现空指针异常
  1. 拆箱导致,示例:
    private static void test(Integer id){
        OptionalBean optionalBean = new OptionalBean(id,"demo");
        int id = optionalBean.getId();
        System.out.println(id);
    }
    
    此时OptionalBean有两个属性一个是id,类型是int,一个是name,类型是String,此时id作为参数传递过来,如果不判空,直接用来创建对象,那么如果id为null,那么也会出现空指针。

为了避免空指针,我们必须做很多的判空操作,比如:

        //有工具类判空
        StringUtils.isBlank();
        StringUtils.isNoneBlank();
        CollectionUtils.isEmpty();
        
        
        //条件语句判空
        if(null != a){...}
        if("" != a){...}

那么null会带来哪些问题呢?

  1. 最典型的抛空指针异常,可能阻断程序执行
  2. 代码膨胀,到处需要判空操作

在这里插入图片描述在这里插入图片描述

注意这些方法Optional调用的时候,如果值不存在,返回的不是null,而是空的Optional对象,所以调用方法时不需要刻意判空。

Optional对象

创建一个空Optional

Optional.empty()

创建非空Optional

Optional.of(Apple apple)

若apple为null,那么本行就会抛异常空指针异常

创建参数可以为null的Optional

Optional.ofNullable(Apple apple)

此方法参数可以传null,如果参数为null,返回的结果是空的Optional。

方法使用示例:

        Trader trader1 = new Trader("Tom", "纽约", new Transaction(1200000, new Date()));
        Trader trader2 = new Trader("Jul", "北京", new Transaction(1000000, new Date()));
        List<Trader> traderList = new ArrayList<>();
        traderList.add(trader1);
        traderList.add(trader2);
        Optional.of(traderList)
                .filter(traders -> traders.size()> 0)
                .ifPresent(traders -> System.out.println(traders.get(0).getName()));
                
        结果:
        Tom

filter()的参数谓词,即返回结果为boolean代码块;

ifPresent()的参数Consumer,即有一个参数无返回值,调用此方法表示如果只存在执行此方法,否则不进行其他操作。

        Apple apple = new Apple("red", 120, "富士");
        Optional<Apple> apple1 = Optional.ofNullable(apple);
        Integer integer = apple1.map(Apple::getWeight)
                .orElse(0);
        System.out.println("苹果的重量:"+ integer +"克");
        
        结果:
        苹果的重量:120克

map()方法获取对象中的值,还有一个flatMap(),使用方式与Stream中的方法相同。

orElse()方法类似条件语句中的else,如果对象为空,那么就返回默认值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值