我想将以下功能实现为Java8 Lambda
private StructType getSchema(Dataset<Row> df, List<String> cols){
StructType schema = df.schema();
for (String col: cols){
schema.add(col, "int", true);
}
return schema;
}
当我尝试使用下面的代码
private StructType getSchema(Dataset<Row> df, List<String> cols){
StructType schema = df.schema();
cols.forEach(col -> schema = schema.add(col, "int", true));
return schema;
}
我遇到编译错误
variable used in lambda expression should be final or effectively final.
我该如何解决?
答案 0 :(得分:1)
(无论出于何种原因)您正在分配该架构,只需不要:
private StructType getSchema(Dataset<Row> df, List<String> cols){
StructType schema = df.schema();
cols.forEach(col -> schema.add(col, "int", true));
return schema;
}
答案 1 :(得分:0)
“最终或最终有效”是指,如果在lambda表达式之外声明了变量(例如您的schema
是),则可以读取该变量或对其调用方法,但不能分配给它。
StructType的javadoc建议StructType
是一个不可变的类,其中add
方法返回一个新实例,因此forEach
可能是错误的迭代类型这里。原始的插入实际上是一个更好的选择。