java 8 несоответствие интерфейса lambdas [дубликат]

Другой способ сделать это в 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'))
10
задан Ulrich Schmidt 18 May 2016 в 19:15
поделиться

2 ответа

Метод

consume(String) соответствует интерфейсу Consumer<String>, поскольку он потребляет String - тот факт, что он возвращает значение, не имеет значения, поскольку в этом случае он просто игнорируется. (Поскольку интерфейс Consumer вообще не ожидает никакого возвращаемого значения).

Это должен был быть выбор дизайна и в основном утилита: представьте, сколько методов нужно было бы реорганизовать или продублировать для соответствия потребностям функциональных интерфейсов, таких как Consumer или даже очень распространенных Runnable. (Обратите внимание, что вы можете передать любой метод, который не использует никаких параметров в качестве Runnable для Executor, например.)

Даже такие методы, как java.util.List#add(Object), возвращают значение: boolean. Невозможно передать такой метод ссылок только потому, что они возвращают что-то (что в большинстве случаев не имеет значения во многих случаях) будет довольно раздражать.

12
ответ дан JustACluelessNewbie 27 August 2018 в 15:25
поделиться

Как Брайан Гетц указал на в комментарии , основой для конструктивного решения было позволить адаптировать метод к функциональному интерфейсу так же, как вы можете назвать метод , т. е. вы можете вызвать метод возвращаемого значения и проигнорировать возвращаемое значение.

Когда дело доходит до лямбда-выражений, все становится немного сложнее. Существуют две формы лямбда-выражений: (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) - это форма выражения только , которая не совместима со значением.

10
ответ дан Community 27 August 2018 в 15:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: