我想首先指出,我对编码很陌生,所以这可能看起来很简单,但我就是想不通。
我正在使用一个现有项目,该项目使用 JXBrowser 从网站中提取信息。它使用方法从网站对象中选择所有元素getRecords()
并将其放入List<Element>
(import java.util.List
的一部分(。这段代码是浏览器管理器类中的一个方法,用于创建和处理 JXBrowser 实例。
我希望saveRecords()
方法从网站中提取数据并将列表返回到我的主作业执行器。但是,我的 IDE 将return records
部分标记为错误 - "意外返回值"。
我怀疑这可能与使用匿名方法有关,这种方法不是我自己写的,也没有任何经验。
public List<Element> saveRecord() {
if (website != null) {
browser.mainFrame().ifPresent(frame -> frame.document().ifPresent(document -> {
List <Element> records = website.getHandler().getRecords(document);
if (records.isEmpty()) {
log.error("no record found on site!");
} else {
return records;
}
}));
} else {
log.error("no handler found!");
}
}
您没有从方法中返回任何内容,该方法应返回一个List<Element>
。另一方面,你从传递给Optional.ifPresent()
的函数(lambda(返回(但并非在所有情况下(,尽管lambda应该是一个Consumer
,因此不应该返回任何东西。
如果您不了解作为方法回调传递的函数(lambdas(的原理,我建议您在使用它们之前先研究一下。或者,只需使用Optional.isPresent()
后跟Optional.get()
来测试可选值并获取它(如果存在(,以保持命令式编程。
如果你想使用函数式编程,那么你不应该使用ifPresent()
。您应该改用map()
、flatMap()
和orElse
将 Optional 转换为值。
在所有情况下,您需要决定的第一件事是如果记录为空该怎么办,如果网站为空该怎么办。你不能像你想做的那样什么都不做。要么返回一些东西(例如空列表(,要么抛出异常。但你不能只是记录一个不返回。
你需要在方法末尾返回语句。如果结果为空,则可以返回空列表或抛出异常。