迭代列表并使用另一个列表中可用的数据设置值

iterate the List and set the value with data available in another list

我有以下两个 List 对象,我想迭代 addrMappingList 并通过从 personList 获取 person 对象将 Person 设置到该字段。 下面是示例代码。

List<Person> personList = getPersonList();
List<AddressMapping> addrMappingList = personToAddressMappingList();

地址映射示例 class:

class AddressMapping {

 private int id;
 private Person person;
 ..
}

样本人物class:

Class Person{
  private int personId;
  private String personName;
  ...
 }

我想迭代 addrList 并且我想为每个 addrList 元素设置 personList 元素。 尝试了以下代码:

for(AddressMapping addrMapping : addrMappingList){
  for(Person p : personList){
     addrMapping.setPerson(p);
  }
}

我不应该像上面的代码那样在 addrMapping 中迭代 Person,任何输入都会有所帮助。 PS: 两个列表没有任何数据可以比较和设置值。

你只需要一次迭代就可以做到这一点。由于您实际上需要索引,这也意味着您可以为此使用一个很好的旧 for 循环:

List<Person> personList = getPersonList();
List<AddressMapping> addrMappingList = personToAddressMappingList();

for(int i = 0; i < personList.size(); i++) {
    addrMappingList.get(i).setPerson(personList.get(i));
}

当然,因为personListaddrMappingList的元素个数相同,所以这是一个选项。

更新

如果“with Java8”是指使用更“现代”的语法,您还可以使用以下语法。

List<Person> personList = getPersonList();
List<AddressMapping> addrMappingList = personToAddressMappingList();

IntStream.range(0, personList.size())
             .forEach(i -> addrMappingList.get(i).setPerson(personList.get(i)));

综上所述,我认为第一种方法更好,因为这是一个非常简单的函数,不值得过度复杂化。我真的不知道是否有任何性能优势(如果有,在什么时候它们会很明显),但除非它很重要,否则我更喜欢可读性(KISS 原则)。

如果您的意思是这两个列表是 parallel arrays, 并且一个列表中的第一个元素与另一个列表中的第一个元素配对,等等,那么您不应使用 foreach 循环。相反,显式管理索引:

if (personList.size() != addrMappingList.size()) throw new IllegalArgumentException();
for (int idx = 0; idx < addrMappingList.size(); ++idx) {
    addrMappingList.get(idx).setPerson(personList.get(idx));
}