java - 使用 List 的方法中的“意外返回值”
问题描述
我想首先指出我对编码很陌生,所以这看起来很简单,但我就是想不通。
我正在处理一个使用 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>
. 另一方面,您从传递给的函数 (lambda) 返回(但并非在所有情况下)Optional.ifPresent()
,尽管 lambda 应该是 a Consumer
,因此不应该返回任何东西。
如果您不了解作为回调传递给方法的函数(lambdas)的原理,我建议您在使用它们之前先研究一下。或者继续使用命令式编程,只需使用Optional.isPresent()
followOptional.get()
来测试可选项是否有值,如果存在则获取它。
如果你想使用函数式编程,那么你不应该使用ifPresent()
. 您应该改用map()
,flatMap()
并将orElse
您的 Optional 转换为一个值。
在所有情况下,您需要决定的第一件事是如果记录为空该怎么办,以及如果网站为空怎么办。你不能只是不做任何你想做的事情。要么你返回一些东西(例如一个空列表),要么你抛出一个异常。但是您不能只记录不返回。
推荐阅读
- html - 父 div(flex) 中的 2 个 div,第一个 div 是固定宽度 - 将第二个宽度扩展到其余部分
- c - 二进制搜索不返回位置
- ruby-on-rails - Ruby on Rails 应用程序和咨询锁中的 PgBouncer
- javascript - Materialize M 未定义
- ruby-on-rails - 设计销毁用户在索引页面中创建错误
- c# - 使用 Azure Active Directory 对 .NET Core 2.2 API 进行身份验证时出现 CORS 错误
- .net-core - 将 Visual Studio 2019 更新到 16.4.0 后,我无法使用目标框架 2.2 运行测试
- regex - squeak(Smalltalk) 在字符串中搜索正则表达式
- javascript - 如何使用 jquery 验证输入文件类型 onclick 提交?
- vue.js - Vuetify 工具提示现在显示在卡片组件内的按钮内