Как использовать java лямбда-выражение foreach для добавления в существующий список - PullRequest
0 голосов
/ 02 апреля 2019

Я хочу реализовать следующие функции как 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 ]

1 голос
/ 02 апреля 2019

Вы назначаете (по любой причине) эту схему, просто не делайте:

private StructType getSchema(Dataset<Row> df, List<String> cols){
    StructType schema = df.schema();
    cols.forEach(col -> schema.add(col, "int", true));
    return schema;
}
0 голосов
/ 02 апреля 2019

«Окончательный или фактически окончательный» означает, что если переменная объявлена ​​вне лямбда-выражения (как ваш schema), то вы можете прочитать ее или вызвать методы, но не назначить к этому.

Javadoc для StructType предполагает, что StructType является неизменяемым классом, где метод add возвращает новый экземпляр, поэтому forEach, вероятно, является неправильным видом итерации, чтобы использовать здесь. Ваше оригинальное предложение действительно лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...