如何使用Java Lambda表达式foreach添加到现有列表

时间:2019-04-02 20:23:33

标签: apache-spark lambda java-8

我想将以下功能实现为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.

我该如何解决?

2 个答案:

答案 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可能是错误的迭代类型这里。原始的插入实际上是一个更好的选择。