【问题标题】:Java: Use streams to join 2D string[][] array with 2 different delimitersJava:使用流连接具有 2 个不同分隔符的 2D 字符串 [] [] 数组
【发布时间】:2019-03-06 22:09:35
【问题描述】:

我已将数据库模式创建为二维字符串数组。我想把整个东西组合成一种格式,比如

"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,
     *    ...
     *  )"
     */
  }

【问题讨论】:

  • 您正试图根据foreach 的结果调用collect,但foreach 没有返回 内容。

标签: java arrays string java-stream


【解决方案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(", "))
            + ")";

【讨论】:

  • 或者只是.map(col -> String.join(" ", col))。而对于外部操作,我会使用 .collect(Collectors.joining(", ", "CREATE TABLE apis (", ")")) 而不是在 Stream 操作之后执行另一个字符串连接。
【解决方案2】:

.forEach() 是一个终止操作。


你需要

Arrays.stream(COLUMN_DATA)
      .map(col -> Arrays.stream(col).collect(Collectors.joining(" ")))
      .collect(Collectors.joining(", "))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-27
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 2020-11-29
    • 2019-02-25
    • 1970-01-01
    相关资源
    最近更新 更多