Статьи

Концепции функционального программирования в JDK 7

В JDK 7 и, в частности, в Lambdas много волнений! Я пробирался через наворот, чтобы помочь вам понять это.

Если вы будете искать JDK 7 в своей любимой поисковой системе, скорее всего, вы начнете сталкиваться с противоречиями, связанными с ламбадами на Java, довольно рано на вашей охоте. Это спорный вопрос, который означает, что он привлекает много внимания со стороны умных людей, но это, в свою очередь, замедляет процесс и создает трудности при принятии решений.

Я предполагаю, что лямбды будут в JDK 7 — вы можете увидеть множество доказательств этого в Интернете и в сборках моментальных снимков. Тем не менее, ни одно решение не является конкретным (что является мудрым советом от Прагматического Программиста не меньше!). Эта статья предназначена для тех, кто мало знает о функциональном программировании или о том, что такое Lambdas, Closures или Curry, и хочет получить «грунтовку».

Лямбда

Лямбды не новая концепция. Они были примерно с 30-х годов в более широкой теме Lambda Calculus, представленной Алонзо Черчем. С тех пор они стали основной функцией многих функциональных языков программирования, наиболее выдающимся из которых, вероятно, будет Lisp. Таким образом, сам предмет является довольно обширным, но в его простейшей форме было бы справедливо заявить, что лямбда — это особенность функции первоклассных граждан в языке; то есть система типов рассматривает их как отдельный объект. Лямбда — это анонимная функция. Чтобы продемонстрировать, вот фрагмент Python, который вы обычно можете увидеть:

list = [1, 2, 3, 6, 8,]
print filter(lambda x: x * 2 > 10, list)
[6, 8]

Выражение «lambda x: x * 2> 10» является лямбда-функцией — анонимной во время выполнения и выполняемой в функции фильтра. Точно так же вы можете присвоить переменное то же выражение и передать его, либо альтернативно вызвать саму функцию:

f = lambda x: x * 2 > 10
print filter(f, list)
[6, 8]
# Let's call f itself
f(1)
False

В Java в настоящее время у нас есть анонимные внутренние классы, которые слегка демонстрируют Lambd в том смысле, что они являются анонимными и объектами сами по себе (потому что они просто скомпилированы во внутренний класс). Будучи переданы методу, они становятся обычным предметом. Примером может быть:

File cwd = new File(".);
System.out.println(cwd.list(new FileFilter() {
public boolean accept(File f) {
return f != null && f.getName().endsWith(".java");
}
}));

А пока, думайте о лямбдах просто как о анонимных функциях, которые сами по себе являются объектами. В Java это может означать «обратные вызовы», настоящую рекурсию и другие замечательные вещи — возможно, прошли те времена, когда внедрялся интерфейс Comparator для фильтрации коллекции. Если они будут завершены в JDK 7, я лично с нетерпением жду появления гораздо более динамичного языка, который получит новую жизнь!

Типы функций

Как упоминалось ранее, лямбда-выражения по сути представляют другую концепцию функционального программирования: типы функций. Это просто означает наличие функций в качестве объектов, как String или BigDecimal. Это позволяет вам передавать их другим функциям (или даже возвращать их — см. «Функции более высокого порядка» ниже), как и любой другой тип.

Затворы

Возможно, вы также слышали о другом термине, часто встречающемся в дебатах — «Закрытия». Это еще один аспект функционального программирования, который довольно прост. Замыкание — это способность иметь функцию внутри другой функции и для этой внутренней функции ссылаться на переменные вне ее области действия; такие переменные называются «свободными», потому что они не являются параметрами замыкания или локальными переменными. Подумайте о конечных переменных, которые доступны анонимным внутренним классам в Java из включающего их метода.

На самом деле, если вы много читали на эту тему в отношении JDK 7, вы, вероятно, увидите термин замыкание больше, чем лямбда-выражения, это потому, что оба они часто встречаются вместе — лямбда-выражения становятся замыканиями, когда они получают доступ к переменным вне их области видимости и замыканий лямбды по определению. 

Функции высшего порядка

Функция более высокого порядка — это функция, которая принимает или возвращает другую функцию. В примерах Python в начале этой статьи вы видели использование функции «фильтр». Само по себе это функция высшего порядка, поскольку ее первый параметр — это функция, которая используется для проверки содержимого каждого элемента списка (второй параметр). 

Карринг

Карри может быть лучше всего объяснено как «цепные» лямбды. При наличии функции, которая принимает несколько аргументов, карринг представляет собой процесс преобразования этой функции так, чтобы каждый аргумент передавался функции, возвращаемой каждым исходным вызовом функции. Демонстрировать:

// "mul" is function that takes two arguments; both ints
mul(5).(5); // returns 25

Некоторые «приятно иметь»

Другие концепции функционального программирования, которые, я думаю, было бы неплохо иметь:

  • Понятия списков — синтаксический сахар для создания списков (или наборов, карт и т. Д.) В виде «однострочников»; например, List <String> l = (для x в someOtherCollection) {x.someMethod () && x.another (); }
  • Хвостовая рекурсия — способность компилятора (или среды выполнения) идентифицировать функцию как вызывающую себя в последней из ее инструкций, что позволяет значительно оптимизировать код.  

В чем смысл?

Хороший вопрос. Есть много рассуждений, наиболее очевидным для меня было бы меньше кода, написанного в целом, и другой путь абстракции. Вместо того, чтобы реализовывать интерфейсы для передачи для FilenameFilters, Comparators и т.п., вы можете передавать функции, которые синтаксически требуют меньше раздувания.

Хорошим источником примеров, основанных на «прецеденте», является блог Нила Гафтера (который знает кое-что о Java :)), начните здесь и здесь .

Вывод

Мир программирования изобилует альтернативными парадигмами, мышлением нового века и традициями. Функциональное программирование — это еще один отличный подход к разработке программного обеспечения, который предоставляет свои плюсы и минусы; Как и все функции программирования, это еще один инструмент, который может помочь вам или не помочь вам в написании лучшего программного обеспечения. Независимо от его использования, я считаю, что Project Lambda — если он будет завершен — может дать глоток свежего воздуха для языка, который все еще очень популярен, но имеет свои недостатки.