Другой способ сделать это в pySpark, используя sqlContext ...
#Suppose we have a dataframe:
df = sqlContext.createDataFrame([('row1_1','row1_2')], ['colname1', 'colname2'])
# Now we can concatenate columns and assign the new column a name
df = df.select(concat(df.colname1, df.colname2).alias('joined_colname'))
consume(String)
соответствует интерфейсу Consumer<String>
, поскольку он потребляет String
- тот факт, что он возвращает значение, не имеет значения, поскольку в этом случае он просто игнорируется. (Поскольку интерфейс Consumer
вообще не ожидает никакого возвращаемого значения).
Это должен был быть выбор дизайна и в основном утилита: представьте, сколько методов нужно было бы реорганизовать или продублировать для соответствия потребностям функциональных интерфейсов, таких как Consumer
или даже очень распространенных Runnable
. (Обратите внимание, что вы можете передать любой метод, который не использует никаких параметров в качестве Runnable
для Executor
, например.)
Даже такие методы, как java.util.List#add(Object)
, возвращают значение: boolean
. Невозможно передать такой метод ссылок только потому, что они возвращают что-то (что в большинстве случаев не имеет значения во многих случаях) будет довольно раздражать.
Как Брайан Гетц указал на в комментарии , основой для конструктивного решения было позволить адаптировать метод к функциональному интерфейсу так же, как вы можете назвать метод , т. е. вы можете вызвать метод возвращаемого значения и проигнорировать возвращаемое значение.
Когда дело доходит до лямбда-выражений, все становится немного сложнее. Существуют две формы лямбда-выражений: (args) -> expression
и (args) -> { statements* }
.
Независимо от того, совместима ли вторая форма void
, зависит ли вопрос о том, значение, например () -> { return ""; }
не совместим с void
, но совместим с выражением, тогда как () -> {}
или () -> { return; }
совместимы void
. Обратите внимание, что () -> { for(;;); }
и () -> { throw new RuntimeException(); }
оба являются совместимыми с void
и совместимыми по значению, поскольку они не выполняются нормально.
Форма (arg) -> expression
совместима по значению, если выражение оценивается значением , Но есть также выражения, которые являются операторами одновременно. Эти выражения могут иметь побочный эффект и поэтому могут быть записаны как автономные инструкции для создания только побочного эффекта, игнорируя полученный результат. Аналогично, форма (arg) -> expression
может быть void
совместимой, если выражение также является выражением.
Выражение формы s -> s
не может быть void
совместимым, так как s
а не заявление, т. е. вы не можете писать s -> { s; }
. С другой стороны, s -> s.toString()
может быть void
совместимым, потому что вызовы методов являются операторами. Аналогично, s -> i++
может быть void
совместимым, поскольку приращения могут использоваться как оператор, поэтому s -> { i++; }
также является допустимым. Конечно, i
должен быть полем для этого, а не локальной переменной.
Спецификация языка Java §14.8. В выражениях выражения перечислены все выражения, которые могут использоваться в качестве операторов. Помимо уже упомянутых операторов вызова и операторов increment / decment, он присваивает имена и выражения создания экземпляра класса, поэтому s -> foo=s
и s -> new WhatEver(s)
также совместимы void
.
В качестве примечания стороны, форма (arg) -> methodReturningVoid(arg)
- это форма выражения только , которая не совместима со значением.