记一次使用Optional的翻车经历

本文探讨了如何在使用Java 8的Optional进行单元格操作时,遇到内容丢失的问题。作者通过实例揭示了Optional.ofNullable与orElse的区别,并提供了orElseGet的解决方案,以避免不必要的资源创建。
摘要由CSDN通过智能技术生成
  • Java18都出了,但是java8的Optional都还没怎么用过在这里插入图片描述
    ,于是最近开始尝试使用Optional。正好最近在写excel导入导出。以前操作excel时都会这样封装一个根据列下标获取单元格的方法(避免getCell获取到的cell为空,同时也防止重复创建单元格):
    public static Cell getCell(Row row, int colIndex) {
        Cell cell = row.getCell(colIndex);
        if (cell == null) {
            cell = row.createCell(colIndex);
        }
        return cell;
    }
  • 于是用Optional改造之后(是不是简洁了好多):
    public static Cell getCell(Row row, int colIndex) {
        return Optional.ofNullable(row.getCell(colIndex)).orElse(row.createCell(colIndex));
    }
  • 接下来开始使用:给单元统一写入值之后给部分单元格设置样式,按设想第一次getCell会创建一个Cell,当设置样式时第二次调用getCell会直接返回,然而神奇的事情发生了,当设置样式后那几个单元格的内容不见了。。。
  • 于是开始debug,然后发现设置样式之前内容是在的,设置之后内容消失,一直以为是样式的锅,开始各种调试样式。。。没卵用
  • 开始怀疑Optional
    于是将改回不使用Optional的代码,结果好了。。。 。。。
  • 开始找原因:
    写了下面的代码:
    在这里插入图片描述
    执行结果果然没让我失望,这才知道Optional.ofNullable(xxx).orElse(yyy)的机制: 当xxx为null时返回yyy,但是不论xxx是否为null,orElse里面的代码都会执行,当我们写常量或者变量的时候无所谓,但若是方法的返回值,这个方法就会被调用。
  • 解决办法:
    public static Cell getCell(Row row, int colIndex) {
        return Optional.ofNullable(row.getCell(colIndex)).orElseGet(() -> row.createCell(colIndex));
    }

即用orElseGet代替orElse,参数为lambda表达式。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值