2017-02-17 7 views
3

Я изучаю, как использовать потоки Java 8. Как я могу сделать следующее, используя потоки вместо цикла:Объединение каждого элемента массива

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

Используйте IntStream от 0 до половины размера списка, и умножить элементы на 2:

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

Ответ, предоставленный @ Энди Тернером, выглядит замечательно. Здесь я просто предлагаю альтернативное решение 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)] 
Смежные вопросы