使用流计算二维数组中的特定字符

cer*_*bin 8 java arrays java-8 java-stream

我想' ' 使用流来计算2D数组中出现的字符(例如空格:).我试图找到一个解决方案.这是我的代码,使用嵌套循环:

public int countFreeSpaces() {
    int freeSpaces = 0;
    for (int i = 0; i < height; i++) {
        for (int j = 0; j < width; j++) {
            if (board[j][i] == ' ') freeSpaces++;
        }
    }
    return freeSpaces;
}
Run Code Online (Sandbox Code Playgroud)

Jac*_* G. 8

我相信这个答案会更具表现力:

int freeSpaces = (int) Arrays.stream(board)
                             .map(CharBuffer::wrap)
                             .flatMapToInt(CharBuffer::chars)
                             .filter(i -> i == ' ')
                             .count();
Run Code Online (Sandbox Code Playgroud)

  • 好的方法,虽然我使用`Arrays.stream`来流过现有的数组而不是varargs方法`Stream.of`.另外,`String :: new`意味着复制`char []`数据,所以我使用`.map(CharBuffer :: wrap).flatMapToInt(CharSequence :: chars)`.与我们可能期望的相反,在Java 8中,`CharBuffer.chars()`的实现甚至比`String.chars()`更有效. (6认同)
  • 首先,投票.由于我写下答案,我不知道OP是使用`char []`还是``[[]`,所以我使用`IntStream`代替.你可以看到我的回答发布时间是在OP说它的类型是`char []`之前. (2认同)