我正在学习如何使用Java 8流。如何使用流而不是for循环执行以下操作:
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);
}
}
答案 0 :(得分:4)
在列表大小的0到一半之间使用IntStream
,并将元素乘以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);
子列表的替代方法是处理流中的最后一个元素:
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());
答案 1 :(得分: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)]