我想知道是否有人可以帮我简化以下代码。
我基本上有两个列表,我基本上想要检查第二个列表中的项是否与ID匹配。如果是,我想用第二个值更新第一个列表中的对象。
postPatch.getSections().forEach(patched -> {
originalSection.getSections().forEach(original -> {
if (original.getId().equals(patched.getId())) {
original.setContent(patched.getContent());
original.setImagePosition(patched.getImagePosition());
original.setTitle(patched.getTitle());
original.setImageUrl(patched.getImageUrl());
}
});
});
我觉得有一种更好的方法可以用Java8来表达它,但是找不到我想要的东西。
答案 0 :(得分:1)
我认为你正确地做到了。我会做一个单独的方法来更新。
假设这是您要更新的POJO类
public class Image {
private Integer id;
private String content;
private Cell position;
private String title;
private URL imageURL;
// ...
public void updateIfMatch(Image patch) {
if (Objects.equals(id, patch.id)) {
id = patch.id;
content = patch.content;
position = patch.position;
title = patch.title;
imageURL = patch.imageURL;
}
}
}
以下是更新列表的代码
getPostPatchedSections().forEach(a -> getOriginalSections().forEach(a::updateIfMatch));
替代解决方案
您也可以在流中进行id比较,而不是在Image类中进行。这个解决方案更像Java 8ish
public class Image {
private Integer id;
private String content;
private Cell position;
private String title;
private URL imageURL;
// ...
public void updateFrom(Image patch) {
id = patch.id;
content = patch.content;
position = patch.position;
title = patch.title;
imageURL = patch.imageURL;
}
}
以下是更新列表的管道代码
getPostPatchedSections()
.filter(Objects::nonNull)
.forEach(a -> getOriginalSections()
.filter(a::equals)
.forEach(a::updateFrom));
答案 1 :(得分:0)
听起来你真的想要使用Map,所以你可以通过id查找播放器。
// Map of id to player.
Map<Integer, Player> players = new HashMap<>();
players.putAll(originalMap);
players.putAll(patchMap);
patchMap中的所有条目都会添加或替换播放器中的条目,与id
匹配这是O(n)
操作,而不是O(n^2)