【问题标题】:Iterate over one collection and get the same index value of another collection遍历一个集合并获得另一个集合的相同索引值
【发布时间】:2021-08-18 12:51:10
【问题描述】:

我想知道在 Java 中是否可以迭代,比如说一个列表,然后获取/设置与其他列表相同的 index(int) 值?

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

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

【问题讨论】:

  • 不要使用 for-each 循环,使用索引 for 循环。

标签: java stream modelmapper


【解决方案1】:

使用两个迭代器:

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


[为了清晰而推荐]

使用番石榴Streams.forEachPair

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

【讨论】:

    【解决方案2】:

    要么,不要使用 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++;
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用带有递增索引的 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。

      【讨论】:

      • 您也可以对循环条件执行i&lt;l1.size() || i&lt;l2.size();,以确保不会抛出ArrayIndexOutOfBoundsException,因为它只会迭代到较小的List 的长度作为选项。
      • @Nexevis 当然可以。取决于您要达到的目标。抛出异常也可以,或者当列表大小不匹配时根本不运行循环。
      • 是的,当然,不是说这是一个更好的选择,只是作为OP的一个选择,以防它符合他的标准。
      • @Nexevis 我认为请求列表的大小至少是响应列表的大小,因为这似乎隐含在问题中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-18
      • 1970-01-01
      • 2019-12-04
      • 2016-01-25
      • 1970-01-01
      • 2018-12-10
      • 2012-06-09
      相关资源
      最近更新 更多