java - 可选 ifPresent 否则调用另一个函数
问题描述
我编写了有效的代码,但是我必须创建额外的行,有没有办法在一行中压缩它?逻辑:取最后一页,用正则搜索功能,如果没有找到,取上一页,用正则搜索功能
Optional<String> totalBoxesLastPage = lastPage.locate(INVOICE_TOTAL_AMOUNT_BOXES);
Optional<String> totalBoxes = totalBoxesLastPage.isPresent() ?
totalBoxesLastPage : nextToLastPage
.flatMap(p -> p.locate(INVOICE_TOTAL_AMOUNT_BOXES));
感谢你们
解决方案
如果可选为空,您可以orElseGet
与供应商一起调用一些计算值的函数。如果存在值,则返回该值,否则返回提供函数产生的结果。在您的情况下,您必须通过Supplier<String>
. 此外,打开包装后的返回类型Optional
应该是 a String
,而不是Optional<String>
.
String totalBoxes = totalBoxesLastPage
.orElseGet(() -> nextToLastPage.flatMap(p -> p.locate(INVOICE_TOTAL_AMOUNT_BOXES))
.orElseThrow(IllegalStateException::new));
推荐阅读
- python - 使用 DataFrame.plot 在堆积条形图中显示总数和百分比
- google-analytics-api - 字段“直接会话”即时接口 - 不在 Api 中?
- javascript - TypeError:无法设置未定义的属性“data_id”
- java - 更改最终对象的属性属性对象
- terraform - terraform:如何使资源具有幂等性-即,如果不存在则创建,但如果存在则不执行任何操作
- python - 多行三引号原始字符串正则表达式不起作用
- javascript - 如何在循环中使用正则表达式替换来更改文本
- c++ - 模板和显式特化
- kentico - Kentico 使用 API 将文件上传到页面类型的文件字段
- google-assistant-sdk - actions-on-google/smart-home-nodejs “家庭控制”在哪里