遍历一个集合并获取另一个集合的相同索引值

Iterate over one collection and get the same index value of another collection

我想知道在 Java 中是否有可能迭代,比方说一个列表,并且 get/set 其他列表的相同索引(int)值?

for (Response e : responseList) {         
   e.setPrimarySkills(requestList.get(??).getPrimarySkills());
}

由于这些问题无法通过模型映射器完成,是否有任何巧妙的方法可以做到这一点?

或者,不要使用 for-each 循环,使用带索引的 for 循环。

for (int i = 0; i < responseList.size(); ++i) {
  responseList.get(i).setPrimarySkills(requestList.get(i).getPrimarySkills());
}

或者,使用一对 Iterators:

Iterator<Response> responseIt = responseList.iterator();
Iterator<Request> requestIt = requestList.iterator();

while (responseIt.hasNext() && requestIt.hasNext()) {
  // Put responseIt.next() and requestIt.next() into variables, if you want.  
responseIt.next().setPrimarySkills(requestIt.next().getPrimarySkills());
}

Iterators 相对于索引的优势在于 Iterators 对于非 RandomAccess 列表是有效的;但是,除非您的列表很大,否则它不太可能是显着(甚至是明显的)差异。


你可以用 for-each 循环来完成,通过自己维护索引,但它在处理两个列表时有点不一致:

int i = 0;
for (Response e : responseList) {         
   e.setPrimarySkills(requestList.get(i).getPrimarySkills());
   i++;
}

您可以使用递增索引的 for 循环:

List<String> l1 = List.of("a", "b");
List<Integer> l2 = List.of(1, 2);

for(int i=0; i<l1.size(); i++) {
  String s = l1.get(i);
  Integer i = l2.get(i);
}

当然你应该首先确保两个列表的长度相等,以避免OutOfBounds Exception。

使用两个迭代器:

Iterator<Response> responseIt = responseList.iterator();
Iterator<Request> requestIt = requestList.iterator();
while(responseIt.hasNext() && requestIt.hasNext()) {
  Response response = responseIt.next();
  Request request = requestIt.next();
  ...
}


[因其清晰度而推荐]

使用 Guava Streams.forEachPair :

Streams.forEachPair(
  requestList.stream(), 
  responseList.stream(), 
  (req, resp) -> resp.setPrimarySkills(req.getPrimarySkills())
);