我已经创建了一个数据库模式作为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,
* ...
* )"
*/
}
当你调用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(", "))
+ ")";
.forEach()
是终止操作。
你需要
Arrays.stream(COLUMN_DATA)
.map(col -> Arrays.stream(col).collect(Collectors.joining(" ")))
.collect(Collectors.joining(", "))