使用流将 2d int 数组格式化为字符串

Formatting a 2d int array into a string using streams

我有以下数组:

private static final int[][] BOARD = {
    { 0, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 0 }
};

我想在其上创建一个字符串表示,所以如果我要在控制台上打印它,它应该如下所示:

[0,0,0,0,0]
[0,0,0,0,0]
[0,0,0,0,0]
[0,0,0,0,0]
[0,0,0,0,0]

我可以使用 2 个嵌套 for 循环来完成此操作,但我正在尝试使用流来完成此操作。这是我到目前为止得到的:

public String toString() {
    StringJoiner board = new StringJoiner("\n");

    for (int i = 0; i < BOARD.length; i++) {
        board.add(
            IntStream.of(BOARD[i])
                .mapToObj(String::valueOf)
                .collect(Collectors.joining(",", "[", "]"))
        );
    }
    return board.toString();
}

这有可能吗?我对性能不是特别感兴趣(如果你愿意,可以随意添加一些关于这方面的评论),我只是想在单个流操作链中做到这一点。

您也可以使用 Arrays.streamas :

Arrays.stream(BOARD)
        .map(aBOARD -> IntStream.of(aBOARD)
                .mapToObj(String::valueOf)
                .collect(Collectors.joining(",", "[", "]")))
        .forEach(board::add);

Collections 的 toString() 已经在 AbstractCollection class 中提供了该符号。只需使用:-

Arrays.stream(BOARD)
        .forEach(ints -> System.out.println(
                Arrays.stream(ints).boxed().collect(Collectors.toList()))
        );

或者,如果您愿意将 int[][] 更改为 Integer[][],您甚至可以:-

Arrays.stream(BOARD)
        .forEach(ints -> System.out.println(Arrays.deepToString(ints)));

您可以嵌套 stream 并将每个级别映射在一起,首先用逗号,然后用系统行分隔符。喜欢,

return Arrays.stream(BOARD).map(a -> Arrays.stream(a)
            .mapToObj(String::valueOf).collect(Collectors.joining(",", "[", "]")))
            .collect(Collectors.joining(System.lineSeparator()));

我明白了

[0,0,0,0,0]
[0,0,0,0,0]
[0,0,0,0,0]
[0,0,0,0,0]
[0,0,0,0,0]