如何使用Java 8循环并打印二维数组

13
Consider this two dimensional array.
String[][] names = { {"Sam", "Smith"},
                     {"Robert", "Delgro"},
                     {"James", "Gosling"},
                   };

使用经典的方式,如果我们要访问二维数组的每个元素,那么我们需要使用两个for循环来迭代遍历二维数组。

for (String[] a : names) {
    for (String s : a) {
        System.out.println(s);
    }
}

是否有一种新的优雅方式,使用Java 8特性(Lambda、方法引用、流等)循环和打印2D数组?

目前我尝试的是这样的:

Arrays.asList(names).stream().forEach(System.out::println);

输出:

[Ljava.lang.String;@6ce253f1
[Ljava.lang.String;@53d8d10a
[Ljava.lang.String;@e9e54c2

你的操作中如何将 String 转换为 int - Holger
抱歉,我已将代码从 for (int[] a : names) { for (int i : a) { System.out.println(i); } } 编辑为 for (String[] a : names) { for (String s : a) { System.out.println(s); } } 感谢 @Holger。 - MChaker
4个回答

23
保持与您的 for 循环相同的输出:
Stream.of(names)
    .flatMap(Stream::of)
        .forEach(System.out::println);
(参见Stream#flatMap。)
还有类似以下的内容:
Arrays.stream(names)
    .map(a -> String.join(" ", a))
        .forEach(System.out::println);

输出结果如下:

Sam Smith
Robert Delgro
James Gosling

(参见String#join。)

另外还有:

System.out.println(
    Arrays.stream(names)
        .map(a -> String.join(" ", a))
            .collect(Collectors.joining(", "))
);

它产生的输出如下:

Sam Smith,Robert Delgro,James Gosling

(请参见Collectors#joining。)

连接是Java 8中不太讨论但仍然很好的新功能之一。


12

试一试

Stream.of(names).map(Arrays::toString).forEach(System.out::println);

10
在标准的Java中
System.out.println(Arrays.deepToString(names));

3
非常好,但是否有一种使用Java 8特性的新方法? - MChaker

1

使用Java 8的StreamsforEach

    Arrays.stream(names).forEach((i) -> {
        Arrays.stream(i).forEach((j) -> System.out.print(j + " "));
        System.out.println();
    });

第一个forEach作为外循环,而下一个作为内循环。
这将产生以下输出:
Sam Smith 
Robert Delgro 
James Gosling

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接