我编写了有效的代码,但是我不得不创建额外的行,是否有办法将其压缩到一行中?逻辑:获取最后一页,通过正则表达式执行搜索功能,如果找不到,则获取前一页并通过正则表达式执行搜索功能
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
后的返回类型应该是String
,而不是Optional<String>
。
String totalBoxes = totalBoxesLastPage
.orElseGet(() -> nextToLastPage.flatMap(p -> p.locate(INVOICE_TOTAL_AMOUNT_BOXES))
.orElseThrow(IllegalStateException::new));
这对我来说很有效,因为看不到.or函数,我实在是盲目。
or(Supplier<? extends Optional<? extends T>> supplier)
public Optional<String> findBetweenTwo(Page lastPage,Optional<Page> nextToLast,Pattern pattern) {
return lastPage.locate(pattern).or(() -> nextToLast.flatMap(p -> p.locate(pattern)));
}