Есть ли причины, по которым указание типа аргумента требуется в лямбда-синтаксисе Java 8? - PullRequest
5 голосов
/ 18 января 2012

Я прочитал http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-4.html и заметил, что во всех примерах тип аргумента объявлен явно, хотя он уже известен из объявления функции интерфейса.

public interface FileFilter {
    /** ... **/
    boolean accept(File pathname);
}


FileFilter java = (File f) -> f.getName().endsWith(".java");

Разве мы не можем пойти только с

(f) -> f.getName().endsWith(".java"); ?

ОБНОВЛЕНИЕ : В JSR-335 Draft я обнаружил, что параметры логического типа, скорее всего, поддерживаются

(int x) -> x+1 // Single declared-type parameter
(int x) -> { return x+1; } // Single declared-type parameter
(x) -> x+1 // Single inferred-type parameter
x -> x+1 // Parens optional for single inferred-type case 

Ответы [ 2 ]

3 голосов
/ 18 января 2012

Есть пример, где тип опущен в разделе «4. Типовое назначение»

Comparator<String> c = (s1, s2) -> s1.compareToIgnoreCase(s2);
0 голосов
/ 18 января 2012

Я думаю, это зависит от того, как поздно он знает тип.

В Java 7 код в правой части = не знает, как использовать это выражение. Для компиляции требуется изменение дизайна компилятора.

Теоретически вам даже не нужно объявление переменной, потому что оно указано в родительском или может подразумеваться.

FileFilter java = (File f) -> f.getName().endsWith(".java");

может быть

FileFilter java = -> pathname.getName().endsWith(".java");

или с подразумеваемым геттером.

FileFilter java = -> pathname.name.endsWith(".java");

или вы можете предположить, что параметры импортируются в пространство имен неявно, так как имеется только один параметр. (Как SQL делает с именами столбцов)

FileFilter java = -> name.endsWith(".java");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...