Java 7 будет иметь закрытия (наконец) и интересно, как существующий код с помощью классов/интерфейсов отдельного метода (как Выполнимый, Компаратор, и т.д.) будет использоваться теперь.
Это кодировало бы быть замененным? Будет какое-то преобразование? Дополнительный метод с помощью закрытия будет добавлен?
Кто-либо знает, как это собирается работать/каким, планы?
Например, для использования FileFilter сегодня мы делаем:
....
File [] files = directory.listFiles( new FileFilter()
public boolean accept( File file ) {
return file.getName().endsWith(".java");
}
});
Кто-либо знает, как это собирается работать над Java7?
Возможно, перегружая метод File.listFiles для получения закрытия?
File [] files = directory.listFiles(#(File file){
return file.getName().endsWith(".java");
});
Эти классы/интерфейсы называются типами SAM (Single Abstract Method), и преобразование лямбд в типы SAM является центральной частью предложения по проекту лямбд для JDK7. Фактически, последняя итерация предложения удаляет типы функций и только разрешает лямбды как экземпляры SAM-типов. Используя последнюю версию синтаксиса (которая не является окончательной), ваш пример можно было бы написать так:
File[] files = directory.listFiles(#(file){file.getName().endsWith(".java")});
С listFiles(FileFilter)
без изменений по сравнению с тем, что есть сейчас.
Вы также можете написать
FileFilter javaFileFilter = {#(file){file.getName().endsWith(".java")};
Вы также можете взглянуть на этот State of the Lambda документ, который является последним обновлением предложения и объясняет все более подробно. Обратите внимание, что все детали могут быть изменены, хотя совершенно точно, что лямбда-выражение/блок будет использоваться как SAM-тип, как я описал.