使用Lambda按ID合并列表

时间:2015-12-31 20:20:31

标签: lambda java-8

我想知道是否有人可以帮我简化以下代码。

我基本上有两个列表,我基本上想要检查第二个列表中的项是否与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来表达它,但是找不到我想要的东西。

2 个答案:

答案 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)