我有两个列表,第一个是我收集的数据,另一个是来自数据库的数据。
如果我想比较这两个列表,并从数据库中找到所有缺少结果的行(现有提示(,但在newTips列表中有这些信息的地方,我可以做类似的事情。
List<Tips> tipsToUpdate = new ArrayList<>();
newTips.forEach(nt ->
existingTips.stream()
.filter(et -> nt.getTipKey.equals(et.getTipKey()) &&
nt.getResult != null && et.getResult == null))
.forEach(tipsToUpdate::add));
但是如果我想从newTips列表中找到所有具有";tipKey";不存在于现有提示列表中。我想将这些保存到提示保存列表中。我该如何编写这种lambda表达式?
有可能把这两个表达式放在同一个表达式中吗?还是把它们分开更好?
编辑:在亚历山大解决方案之后,我发现我的想法有点错误。
当我保存到数据库时,我会创建一个@ID。所以在现有的Tips中我有一个ID,但在新的Tips里没有。所以我实际上需要从现有的Tip中获取getId,因为我在新的Tips中没有它。结果实际上可能只是由existingTip中的getId和newTips中的getResult组成。
List<Tips> result =
newTips.stream()
.filter(nt -> existingTipByKey.containsKey(nt.getTipKey())
.filter(nt -> nt.getResult != null &&
existingTipByKey.get(nt.getTipKey()).getResult == null)
.collect(new UpdateDTO(existingTipByKey.get(nt.getTipKey()).getId, nt.getResult());
我知道我不能像上面那样收集新的UpdateDTO。
其中UpdateDTO与长id和字符串结果一致。你对如何解决这个问题有什么建议吗?
如果我理解正确,您将尝试在末尾获得两个列表。第一个是CCD_ 1,第二个是CCD_。这可以使用Collectors.partitioningBy
来完成。以下是的示例
Set<String> existingTipKeys = existingTips.stream()
.filter(t -> t.getResult() == null)
.map(Tips::getTipKey)
.collect(Collectors.toSet()); // Use a Set or Map to check the keys. As mentioned in another answer it will increase performance.
Map<Boolean, List<Tips>> tips = newTips.stream()
.filter(t -> t.getResult() != null)
.collect(Collectors.partitioningBy(t -> existingTipKeys.contains(t.getTipKey())));
List<Tips> tipsToUpdate = tips.get(true);
List<Tips> tipsToSave = tips.get(false);