Java:使用流将2D string [] []数组与2个不同的分隔符连接起来

问题描述 投票:0回答:2

我已经创建了一个数据库模式作为2D字符串数组。我想将整个事物组合成一种格式

"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,
     *    ...
     *  )"
     */
  }
java arrays string java-stream
2个回答
1
投票

当你调用the forEach method时,这是流上的终端操作。它对流中的每个元素执行一个动作,但它不会返回任何内容 - 不是另一个Stream,而不是由lambda表达式生成的任何内容 - 什么都没有。

相反,您应该将每个内部数组转换为您想要的字符串,并将其保留在以后要收集的流中。使用the map method

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

1
投票

.forEach()是终止操作。


你需要

Arrays.stream(COLUMN_DATA)
      .map(col -> Arrays.stream(col).collect(Collectors.joining(" ")))
      .collect(Collectors.joining(", "))
© www.soinside.com 2019 - 2024. All rights reserved.