- 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表达式。