Java:将一个对象列表的属性映射到另一个对象列表的最有效方法

Sha*_*vil 5 java mapping loops design-patterns list

我正在寻找一种有效的设计模式,将一个对象列表映射到另一个对象列表,并且它们之间具有零或一对一的关系。我意识到这种事情通常是在关系数据库中完成的,但在这种特殊情况下,它确实需要在 Java 应用程序中完成......

假设第一个列表包含Foo对象(即List<Foo>):

public class Foo {
    public Integer id;
    public String barName;
}
Run Code Online (Sandbox Code Playgroud)

第二个列表包含Bar对象(即List<Bar>):

public class Bar {
    public Integer fooId;
    public String name;
}
Run Code Online (Sandbox Code Playgroud)

如何最有效地将所有name属性映射Bar到eq​​uals 的Foo对象?Bar.fooIdFoo.id

我能想到的最好的是:

void mapFooBar(List<Foo> fooList, List<Bar> barList) {
    for (Bar bar : barList) {
        for (Foo foo : fooList) {
            if (bar.fooId.equals(foo.id)) foo.barName = bar.name;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:根据几个答案,我改进了我的代码,如下所示:

void mapFooBar(List<Foo> fooList, List<Bar> barList) {
    Map<Integer, String> barMap = new HashMap<Integer, String>();
    for (Bar bar : barList)
        barMap.put(bar.fooId, bar.name);

    for (Foo foo : fooList)
        if (barMap.containsKey(foo.id)) foo.barName = barMap.get(foo.id);
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

Jig*_*shi 1

这很复杂,N * M意味着如果你有 5 个 foo 和 8 个 bar,则必须执行循环 40 次

class Container{

  List<Foo> foos;
  List<Bar> bars;

}
Run Code Online (Sandbox Code Playgroud)

如果你使用Map<Integer, Container>它将是N + M (5 + 8 = 13 次)

遍历两个列表一次并将其映射为id


另请参阅