Подтвердить что ты не робот

Как интерфейсы будут заменены/дополнены закрытием на Java?

В Java 7 будут закрыты (наконец), и мне интересно, как теперь будет использоваться существующий код с использованием одних классов/интерфейсов метода (например, Runnable, Comparator и т.д.).

Будет ли заменен этот код? Будет какая-то конверсия? Будет добавлен дополнительный метод с использованием закрытия?

Кто-нибудь знает, как это будет работать/какие планы?

Например, чтобы использовать 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");
                 });
4b9b3361

Ответ 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, как я описал.

Ответ 2

Существующий код не влияет и не нуждается в замене.