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

时间:2018-11-14 03:30:18

标签: java java-stream tostring collect

我有以下数组:

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 }
};

我想在其上创建一个String表示形式,因此,如果要在控制台上打印它,它应该看起来像这样:

[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();
}

这可能吗?我对性能不是特别感兴趣(如果需要,可以在此方面添加一些评论),我只是想在单个流操作链中做到这一点。

3 个答案:

答案 0 :(得分:3)

您也可以使用Arrays.stream,如下所示:

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

答案 1 :(得分:1)

您可以嵌套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]

答案 2 :(得分:0)

Collection的toString()已在AbstractCollection类中提供了该表示法。只需使用:-

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