Java: использовать потоки для объединения двухмерного массива string [] [] с двумя разными разделителями - PullRequest
0 голосов
/ 07 марта 2019

Я создал схему базы данных в виде двухмерного массива строк. Я хотел бы объединить все это в формате, как

"id INT AUTO_INCREMENT PRIMARY KEY,
ssl_support BOOLEAN NOT NULL,
supported_request_formats VARCHAR(7) NOT NULL,
... "

(для ясности добавлены новые строки)

Однако, с помощью кода, который я имею ниже, Eclipse подчеркивает весь кусок, начиная с Arrays.stream красным, и помечает его ошибкой

Cannot invoke collect(Collector<CharSequence,capture#5-of ?,String>) on the primitive type void.

Я не понимаю эту ошибку, потому что внутренний метод collect () должен возвращать String, а не primitive type void.

  private static final String[][] COLUMN_DATA = {
    {"id",                                              "INT",          "AUTO_INCREMENT PRIMARY KEY" },
    { "ssl_support",                                    "BOOLEAN",      "NOT NULL" },
    { "supported_request_formats",                      "VARCHAR(7)",   "NOT NULL" },
    // ...
  };

  @Override
  public String getCreationString() {

    return "CREATE TABLE apis ("
        + Arrays.stream(COLUMN_DATA)
            .forEach(col -> Arrays.stream(col)
                .collect(Collectors.joining(" "))
            )
            .collect(Collectors.joining(", "))
        + ")";

    /*
     * Expected output:
     * 
     *  "CREATE TABLE apis (
     *    id INT AUTO_INCREMENT PRIMARY KEY,
     *    ssl_support BOOLEAN NOT NULL,
     *    supported_request_formats VARCHAR(7) NOT NULL,
     *    ...
     *  )"
     */
  }

Ответы [ 2 ]

1 голос
/ 07 марта 2019

Когда вы вызываете метод forEach , это терминальная операция в потоке. Он выполняет действие с каждым элементом в потоке, но ничего не возвращает - ни один Stream, ни что-либо, сгенерированное вашим лямбда-выражением - ничего.

Вместо этого вы должны преобразовать каждый внутренний массив в нужную вам строку, сохраняя ее в потоке для последующего сбора. Используйте метод map .

return "CREATE TABLE apis ("
            + Arrays.stream(COLUMN_DATA)
            .map(col -> Arrays.stream(col)
                    .collect(Collectors.joining(" "))
                    )
            .collect(Collectors.joining(", "))
            + ")";
1 голос
/ 07 марта 2019

.forEach() является операцией завершения.


Вам нужно

Arrays.stream(COLUMN_DATA)
      .map(col -> Arrays.stream(col).collect(Collectors.joining(" ")))
      .collect(Collectors.joining(", "))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...