如何通过在java lambda表达式的列表中的每个第3个元素之后添加新行来打印列表?

Ano*_*ous 3 java lambda arraylist java-8

假设我有一个列表如下

Collection<?> mainList = new ArrayList<String>();
mainList=//some method call//
Run Code Online (Sandbox Code Playgroud)

目前,我将列表中的元素显示为

System.out.println(mainList.stream().map(Object::toString).collect(Collectors.joining(",")).toString());
Run Code Online (Sandbox Code Playgroud)

我得到了结果

a,b,c,d,e,f,g,h,i
Run Code Online (Sandbox Code Playgroud)

如何通过在java中的列表中的每个第3个元素之后添加新行来打印此列表,以便它将打印结果如下所示

a,b,c
d,e,f
g,h,i
Run Code Online (Sandbox Code Playgroud)

注意:这类似于如何在java中的arraylist中的每个第3个元素之后添加换行符?但是在阅读时自己完成了格式化文件.我想在打印输出时这样做.

Szy*_*iak 5

如果您想坚持使用Java Stream API,那么可以通过将初始列表分区为大小为3的子列表,然后将每个子列表表示为String并将结果与​​之结合来解决您的问题\n.

import java.util.AbstractMap;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;

final class PartitionListExample {

    public static void main(String[] args) {

        final Collection<String> mainList = Arrays.asList("a", "b", "c", "d", "e", "f", "g", "h", "i");
        final AtomicInteger idx = new AtomicInteger(0);
        final int size = 3;

        // Partition a list into list of lists size 3
        final Collection<List<String>> rows = mainList.stream()
                .collect(Collectors.groupingBy(
                        it -> idx.getAndIncrement() / size
                ))
                .values();

        // Write each row in the new line as a string
        final String result = rows.stream()
                .map(row -> String.join(",", row))
                .collect(Collectors.joining("\n"));

        System.out.println(result);
    }
}
Run Code Online (Sandbox Code Playgroud)

有第三方库提供实用程序类,使列表分区更容易(例如GuavaApache Commons Collections),但此解决方案仅基于Java 8 SDK构建.

它的作用是:

  • 首先,我们通过分配行索引进行分组来收集所有元素,并将值存储为列表(例如, {0=[a,b,c],1=[d,e,f],2=[g,h,i]}
  • 然后我们列出所有值,如 [[a,b,c],[d,e,f],[g,h,i]]
  • 最后,我们将列表列表表示为每个行分隔的字符串 \n

产量 Demo

运行以下程序将在输出后打印到控制台:

a,b,c
d,e,f
g,h,i
Run Code Online (Sandbox Code Playgroud)

从以下示例中获取更多信息

参宿一甚至更演奏与下面的示例,并与通过利用较短的溶液想出了Collectors.joining(",").groupingBy集电体,并使用String.join("\n", rows)在端,而不是触发另一个流减少.

        final Collection<String> rows = mainList.stream()
                .collect(Collectors.groupingBy(
                        it -> idx.getAndIncrement() / size,
                        Collectors.joining(",")
                ))
                .values();

        // Write each row in the new line as a string
        final String result = String.join("\n", rows);

        System.out.println(result);
    }
Run Code Online (Sandbox Code Playgroud)

最后的说明

请记住,这不是以所需格式打印元素列表的最有效方法.但是,如果要创建最终结果并且非常易于阅读和理解,那么任何元素的分区列表都会为您提供灵活性.