迭代列表并使用另一个列表中可用的数据设置值
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));
}
当然,因为personList
和addrMappingList
的元素个数相同,所以这是一个选项。
更新
如果“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));
}
我有以下两个 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));
}
当然,因为personList
和addrMappingList
的元素个数相同,所以这是一个选项。
更新
如果“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));
}