Ответ 1
Эти классы/интерфейсы называются типами SAM (Single Abstract Method), а преобразование lambdas в типы SAM является центральной частью проекта lambda для JDK7. Фактически, последняя итерация предложения удаляет типы функций и позволяет только lambdas как экземпляры типов SAM. С последней версией синтаксиса (который является не final), ваш пример можно записать так:
File[] files = directory.listFiles(#(file){file.getName().endsWith(".java")});
С listFiles(FileFilter)
без изменений от того, что теперь.
Вы также можете написать
FileFilter javaFileFilter = {#(file){file.getName().endsWith(".java")};
Вы также можете взглянуть на этот State of the Lambda, который является последним обновлением предложения и объясняет, что происходит в более детально. Обратите также внимание на то, что специфика может быть изменена, хотя она вполне уверена, что выражение/блок лямбда будет использоваться в качестве типа SAM, как я описал.