从内部列表中删除项

w41d8nur  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(248)

我有一份部门清单和地址清单。每个地址都有一个带有起始日期的句点。下面的代码查找每个部门中具有最晚开始日期的地址,并删除所有其他地址。这似乎管用,但我相信可以用更优雅的方式来做。有什么建议吗?

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()));
});
v440hwme

v440hwme1#

你需要一个 TreeMap 收集他们的地址 fromDate ,因为作为 TreeMap 自动排序,您可以检索最后一个键,即最高的键

for (Department department : departments) {
    TreeMap<Date, List<Adress>> fromDate = new TreeMap<>(department.getAdresses().stream()
        .collect(Collectors.groupingBy(adress -> adress.getPeriod().getFromDate())));

    department.setAdresses(fromDate.lastEntry().getValue());
}
d6kp6zgx

d6kp6zgx2#

你的代码一开始就不起作用(你有一个setter),那么为什么要使用gimped呢 .forEach 这里是终点站吗?它不短,什么也得不到,并且会丢失异常透明性、局部变量透明性和控制流透明性。
当有两种方法可以做一件事,而其中一种方法的能力相对较弱时,不要使用它。此外,如果任何部门的内部地址为零,则代码将失败;在这种情况下,正确的做法当然是什么也不做。另外,如果有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));
}

这做的更多(例如,如果一开始没有一个要点,就避免一堆步法,并避免例外)。
尽管它做的更多,但它也明显更短。

相关问题