【发布时间】:2021-12-08 17:38:11
【问题描述】:
这里是 Java 11。我有 2 个List<Fizzbuzz> 实例,latest 和 current。 “最新”列表是 最新 Fizzbuzzes 的列表,在媒体上很热门。 “当前”列表是我的数据库中的 Fizbuzz 列表。我正在比较这些列表。
我需要比较这些列表并创建第三个列表additions,其中包含latest 列表中未在current 列表中找到的所有 Fizzbuzz。它是数据库中没有记录的“新” Fizzbuzz 列表。
此外,我需要将每个添加的 processedAt 字段 (Instant) 设置为相同的当前日期/时间。我想尝试使用 Java Stream API 内联完成这一切。我可以用“老式”的方式完成这个:
List<Fizzbuzz> latestList = getFromFile();
List<Fizzbuzz> currentList = getFromDatabase();
List<Fizzbuzz> additions = new ArrayList<>();
Instant now = Instant.now();
for (Fizzbuzz latest : latestList) {
if (!currentList.contains(latest)) {
latest.setProcessedAt(now);
additions.add(latest);
}
}
我使用 Java Stream API 的最佳尝试是:
List<Fizzbuzz> latestList = getFromFile();
List<Fizzbuzz> currentList = getFromDatabase();
Instant now = Instant.now();
List<Fizzbuzz> additions = latestList.stream()
.filter(latest -> !currentList.contains(latest))
.forEach(addition -> {
addition.setProcessedAt(now);
})
.collect(Collectors.toList());
这会产生编译器错误,因为forEach 不返回任何内容。谁能发现我哪里出错了?
【问题讨论】:
-
你想要
map()而不是forEach()。 -
那么我得到一个编译器错误:“不存在类型变量 R 的实例,因此 void 符合 R”。我认为是因为将其更改为
.map(addition -> addition.setProcessedAt(now))没有返回值? -
是的,您需要从
map()返回一个值。你可以用peek()来做,但这有点不确定,因为它不应该真正修改东西。
标签: java java-stream