"Unexpected Return Value" 在使用 List<Element> 的方法中

"Unexpected Return Value" in Method that uses List<Element>

首先我想指出我对编码很陌生,所以这看起来很简单,但我就是想不通。

我正在处理一个使用 JXBrowser 从网站提取信息的现有项目。它从网站对象中选择所有具有方法 getRecords() 的元素,并将其放入 List<Element>import java.util.List 的一部分)。这段代码是浏览器管理器 Class 内部的一个方法,它创建并处理 JX​​Browser 实例。

我想要 saveRecords() 方法从网站中提取数据并 return 列表到我的主要作业执行器。但是,我的 IDE 将 return records 部分标记为错误 - "Unexpected return value"。

我怀疑这可能与使用匿名方法有关,这不是我自己写的,也没有任何经验。

   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!");
    }
}

您需要在方法末尾添加 return 语句。如果结果为空,您可以 return 清空列表或抛出异常。

您没有从您的方法中 returning 任何东西,它应该 return 一个 List<Element>。另一方面,您从传递给 Optional.ifPresent(), although the lambda is supposed to be a Consumer 的函数 (lambda) returning(但并非在所有情况下),因此不应该 return 任何东西。

如果您不了解作为回调传递给方法的函数 (lambda) 的原理,我建议您在使用它们之前先研究一下。或者继续使用命令式编程,只需使用 Optional.isPresent() 后跟 Optional.get() 来测试可选值是否有值并在它存在时获取它。

如果你想使用函数式编程,那么你不应该使用 ifPresent()。您应该改为使用 map()flatMap()orElse 将您的 Optional 转换为一个值。

在任何情况下,您首先需要决定的是如果记录为空怎么办,如果网站为空怎么办。你不能只是不做任何你想做的事情。要么你 return 一些东西(例如一个空列表),要么你抛出一个异常。但是你不能只记录一个 not return.