使用Guava改进双列表迭代

时间:2015-01-24 12:32:11

标签: java collections functional-programming guava

基本上问题是转换以下代码的最佳方法是什么

for (Link updateLink : updateLinks) {
    for (Link link : project.getLinks()) {
        if(updateLink.equals(link)){
            link.setName(updateLink.getName());
            link.setLink(updateLink.getLink());
        }
    }
}
进入更实用的友好风格。我能想到的最好的是拥有外部循环,并使用函数find来替换第二次迭代和检查。

    for (final Link updateLink : updateLinks) {
        Link link = Iterables.find(project.getLinks(), new Predicate<Link>() {
            @Override
            public boolean apply(Link p) {
                return p.equals(updateLink);
            }
        });

        link.setName(updateLink.getName());
        link.setLink(updateLink.getLink());
    }

有可能以更好的方式写这个吗?

1 个答案:

答案 0 :(得分:0)

如果您只是询问有关如何使用stream和lambdas来替换迭代的建议,那么您可以使用:

updateLinks.stream().forEach(updateLink -> 
    project.getLinks().stream().filter(updateLink::equals)
        .forEach(link -> {
            link.setName(updateLink.getName());
            link.setLink(updateLink.getLink());
        }));

我不确定它比原始代码更清晰。