java 每隔一个数组元素连接一次

55ooxyrt  于 2023-01-11  发布在  Java
关注(0)|答案(2)|浏览(111)

我正在学习如何使用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);
    }
}
gzszwxb4

gzszwxb41#

使用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);

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

bvjxkvbb

bvjxkvbb2#

@Andy Turner提供的答案看起来很棒,这里我只是提供了abacus-common的替代解决方案。

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)]

相关问题