Лямбда-выражения и лямбда-выражения

Во время проекта интеграции Java, который я реализовал в прошлом году, я обнаружил lambdaj и сразу же убедился в его способности быстрее создавать более читаемый код. Я помню, как примерно в то время читал о лямбда-выражениях, появившихся в версии 1.8, и подумал, что нашел плагин, который уже предоставил мне все эти функции.

Теперь я возвращаюсь к лямбда-выражениям и вижу, что, возможно, ошибался в отношении цели и области применения лямбда-кода. Как я вижу сейчас, lambdaj на самом деле не предлагает лямбда-выражений, а скорее является предметно-ориентированным языком, предназначенным для замены повторяющихся циклов в коллекциях. Его синтаксис DSL был похож на анонимные функции и предоставляет некоторые из тех же функций, таких как закрытие и каррированные функции, но в конечном итоге он ограничен JLS.

Теперь мне интересно, что лямбда-выражения 1.8 могут принести проекту Java, а лямбда-выражения - нет. Это просто вопрос повышения производительности за счет встроенной поддержки анонимных функций? Будут ли в 1.8 присутствовать выражения, подобные функциям манипулирования коллекциями lambdaj? Или лямбда-выражения в 1.8 предназначены для меня для создания моих собственных анонимных функций. В таком случае, должна ли быть создана конкретная версия lambdaj для 1.8, которая воссоздает библиотеку функций с использованием реальных анонимных функций?


person Lilienthal    schedule 28.01.2014    source источник
comment
Вы можете найти этот доклад - Lambda: A Peek Under the Hood - как интересный .   -  person McDowell    schedule 28.01.2014


Ответы (2)


lambdaj действительно не предлагает лямбда-выражений

Это верно.

[lambdaj] предоставляет некоторые из тех же функций, например, закрытие

Если под этим вы имеете в виду «он обеспечивает закрытие», то нет. Замыкание не может существовать без лямбда-выражения; на самом деле это частный случай лямбда-выражения, который является наиболее сложным для реализации.

К сожалению, проектная документация LambdaJ вводит в заблуждение, применяя термин «закрытие» к чему-то, что не соответствует требованиям. Пример со страницы вики Closures:

Closure println = closure(); { of(System.out).println(var(String.class)); }

За примером следует такое объяснение:

В частности, метод var() связывает свободную переменную типа String с замыканием.

Это утверждение просто неверно: там вообще не происходит привязки переменных, не говоря уже о свободной переменной. Конструкция приводит к чему-то похожему на унарную функцию, которая ожидает String аргумент. (Ну, на самом деле он ожидает Object, но завершится ошибкой во время выполнения, если передано значение, отличное от String.)

С другой стороны, вызов of() в примере действительно идет немного в направлении захвата локальной переменной. Можно сказать, что аргумент, переданный of(), захватывается возвращаемым им объектом. Однако мы не можем ссылаться на него в дальнейшем синтаксисе; это просто неявная цель последующего вызова метода. Это далеко от полного закрытия.

Мне интересно, что лямбда-выражения 1.8 могут привнести в проект Java, а лямбда-выражения - нет. Это просто вопрос повышения производительности за счет встроенной поддержки анонимных функций?

Поскольку LambdaJ не предоставляет возможности писать анонимные функции, технически на этот вопрос нет ответа. Однако будьте уверены, что замыкания Java 8 превзойдут LambdaJ в зависимости от варианта использования, потому что LambdaJ в основном основан на отражении, тогда как замыкания Java вообще не нуждаются в этом.

Будут ли в 1.8 присутствовать выражения, подобные функциям манипулирования коллекциями lambdaj?

Безусловно, и поддержка очень серьезная и полная. Есть как дополнительные функции, так и функции, которые можно компоновать. Возможности LamdaJ ничтожны по сравнению с тем, что готово к использованию в Java 8. Ознакомьтесь с Streams API.

Одна из основных целей разработки Streams API никогда даже не предназначалась для реализации LambdaJ: автоматическое распараллеливание обработки. Конечно, обработка коллекций, ориентированная на FP, выглядит лучше, чем императивная идиома, но это гораздо больше, чем просто внешний вид: это фундаментальное изменение. Это ставка Java на будущее вычислений, где единственный способ повысить производительность - задействовать больше параллельных потоков обработки.

person Marko Topolnik    schedule 28.01.2014
comment
Я очень впечатлен этим Stream API. Это действительно кажется огромным шагом вперед для Java в целом и делает функционально устаревшим lambdaj в версии 1.8. Я думаю, что проект по-прежнему полезен для кода до 8, который сильно зависит от манипуляций с коллекциями, но, вероятно, следует избегать использования этих закрытий. - person Lilienthal; 29.01.2014
comment
Как я уже упоминал в своем первоначальном ответе здесь (отклоненный и, следовательно, удаленный), мой окончательный вердикт по LambdaJ был отрицательным, потому что, хотя он определенно сделал код более читабельным в случаях использования, которые он явно охватывает, не было никакой гарантии, что ваш следующий вариант использования подойдет . В итоге проект превратился в мешанину смешанной парадигмы, где некоторые вещи были реализованы в стиле FP, а другие - в классической идиоме Java. Я предпочитаю любую одну идиому такой солянке :) - person Marko Topolnik; 29.01.2014
comment
Кстати, что меня больше всего восхищает в LambdaJ, так это невероятно творческий способ использования Java Generics, отражения, генерации байт-кода и невидимых основанных на ThreadLocal связей между строками кода для создания иллюзии лямбда-выражений в классическом синтаксисе Java. - person Marko Topolnik; 29.01.2014

Забудьте о лямбда-выражениях и как можно скорее начните использовать лямбда-выражения Java 8!

Марио Фуско - создатель лямбдажа

person Mario Fusco    schedule 29.01.2014
comment
Тем не менее, примеры лямбдажа были полезны при разработке фреймворка Collector! - person Brian Goetz; 08.05.2014