java - 从内部列表中删除项目
问题描述
我有一个带有地址列表的部门列表。每个地址都有一个带有起始日期的句点。以下代码在每个部门中查找具有最新日期的地址并删除所有其他地址。它似乎有效,但我相信它可以以更优雅的方式完成。有什么建议么?
List<Department> departments = fetchDepartments();
departments.forEach(department -> {
Date fromDate = department.getAddresses().stream().map(address ->
address.getPeriod().getFromDate()).max(Date::compareTo).get();
department.setAddresses(department.getAdresses().stream()
.filter(address -> address.getPeriod().getDateFrom().equals(fromDate))
.collect(Collectors.toList()));
});
解决方案
您的代码一开始就不起作用(您有一个设置器),那么为什么在.forEach
这里使用相当笨拙的终端呢?它不是更短,你一无所获,你失去了异常透明度、局部变量透明度和控制流透明度。
当有 2 种方法可以做一件事,而这两种方法中的一种方法能力较差时,请不要使用它。此外,如果任何部门内部地址为零,您的代码将失败;当然,在这种情况下,正确的做法是干脆什么都不做。此外,如果有 2 个以上的地址具有相同的“起始日期”,则将它们全部保存。这是故意的,还是您更愿意选择任意一个。
for (Department d : fetchDepartments()) {
var addresses = department.getAddresses();
if (addresses.size() < 2) continue;
var address = addresses.stream()
.max(Comparator.comparing(a -> a.getPeriod().getFromDate()))
.get();
department.setAddresses(List.of(address));
}
这可以做更多的事情(例如,如果一开始没有要点,就避免一堆步法,并避免例外)。
尽管它做得更多,但它也明显更短。
推荐阅读
- ubuntu - Ubuntu 中的 Ansible Playbook 问题
- javascript - 赋予边界向右导致未对齐问题
- javascript - 无法存储数据 IndexedDB(无法在“IDBObjectStore”上执行“添加”:评估对象存储的键路径未产生值)
- deep-learning - 这种自动编码器架构的损失(binary_crossentropy)停滞在 0.601 左右
- python - 代码执行时间限制的字符串排序问题
- excel - 将日期转换为日期函数
- javascript - 静态 html 页面中的活动菜单
- firebase - 喜欢帖子时减少 Firebase Vue 应用程序的响应时间
- delphi - 在输入 TEdit 时,它会将自身内部的文本加倍
- python - 验证到 staff_user:Django Restframework