2017-02-17 134 views
3

我正在学习如何使用Java 8流。 2连接每个其他数组元素

public static void clump(ArrayList strList) 
{ 
    for(int i = 0; i < strList.size() - 1; i++) 
    { 
     String newStr = "(" + strList.get(i) + " " 
       + strList.get(i + 1) + ")"; 

     strList.set(i, newStr); 
     strList.remove(i + 1); 
    } 
} 

回答

4

使用0,半列表的大小,并乘以元素之间的IntStream:如何为循环执行以下操作使用流而不是

List<String> joined = 
    IntStream.range(0, strList.size()/2) 
     .mapToObj(i -> "(" + strList.get(2*i) + " " 
       + strList.get(2*i + 1) + ")") 
     .collect(Collectors.toList()); 

这使加盟元素添加到新列表中。为了摆脱从原始列表中未加入的元素,且在前面加上加入的元素,我们可以使用一个subList,这是列表的一个可变的看法:

List<String> subList = strList.subList(0, strList.size()/2 * 2); 
subList.clear(); 
subList.addAll(joined); 

Ideone Demo


在子表的东西另一种方法是处理数据流中的最后一个元素太:

List<String> joined = 
    IntStream.range(0, (1 + strList.size())/2) 
     .mapToObj(i -> 
      (2*i + 1) < strList.size() 
       ? "(" + strList.get(2*i) + " " + strList.get(2*i + 1) + ")" 
       : strList.get(2*i)) 
     .collect(Collectors.toList()); 

Ideone demo

0

@Andy Turner提供的答案看起来很棒。在这里我只是通过AbacusUtil提供替代解决方案。

List<String> strList = N.asList("a", "b", "c", "d"); 
List<String> result = Stream.of(strList).split(2).map(e -> e.join(" ", "(", ")")).toList(); 
N.println(result); // [(a b), (c d)] 

strList = N.asList("a", "b", "c", "d", "e"); 
result = Stream.of(strList).split(2).map(e -> e.join(" ", "(", ")")).toList(); 
N.println(result); // [(a b), (c d), (e)] 
相关问题