Лямбда-выражения .NET в Java

Недавно я снова перешел с C# на Java. Но я очень скучаю по лямбда-выражениям и таким вещам, как IEnumerable.Foreach в C#. Поэтому я ищу библиотеку лямбда-выражений на Java.

существуют ли библиотеки лучше, чем LambdaJ?

Также clojure напрямую встраивается в программы Java? То есть могу ли я смешивать код clojure с функциями Java?


person Fakrudeen    schedule 23.01.2011    source источник
comment
Интересно... C# даже не поставляется с IEnumerable.Foreach   -  person Gabe    schedule 23.01.2011
comment
@Gabe - ты прав насчет педантизма. Я имел в виду методы обработки коллекций, которые принимают меры. List‹T›.Foreach/Array.Foreach или Ienumerable‹T›.All и т. д.   -  person Fakrudeen    schedule 24.01.2011


Ответы (3)


Java 8 может иметь встроенную поддержку лямбда-выражений. До тех пор вы можете использовать комбинацию анонимных внутренних классов и библиотек, таких как google-guava. Ниже приведены другие библиотеки, которые вы можете изучить

Или лучше посмотрите на Scala.

person Aravind Yarram    schedule 23.01.2011
comment
Я не понимаю одного, лямбда-выражение запатентовано Microsoft. Каков шанс, что Java сможет его использовать? - person hardywang; 17.07.2012
comment
Я рассмеялся, когда прочитал это, а затем нашел: google.com/patents/US20070044083 .. C# далеко не первый язык с лямбда-выражениями. Патент должен быть одной из тех глупостей, на которые я не хочу подавать в суд за то, что все используют патенты. - person Dale; 22.08.2012

Эквивалентный цикл foreach в Java устроен следующим образом.

List<Foo> fooList = // some list containing foos
for (Foo foo : fooList){
    // do stuff
}

В Java нет лямбда-выражений, однако, если вы можете подождать до Java8, они добавляют замыкания. Самое близкое, что вы можете получить, это анонимные внутренние классы.

person kgrad    schedule 23.01.2011
comment
Спасибо, но я не имел в виду эквивалент ключевого слова foreach в С#. Я имел в виду SomeCollection.ForEach(закрытие). Однако более поздняя часть ответа полезна, хотя a. внутренние классы многословны. - person Fakrudeen; 24.01.2011

Библиотека Google Guava содержит классы Function и Predicate, которые можно использовать для эмуляции функций, подобных лямбда-выражениям. Как упоминает kgrad выше, вы можете создавать анонимные экземпляры каждого из них.

http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/base/Function.html
http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/base/Predicate.html

Хотя вы могли бы легко написать подобные классы самостоятельно, Guava содержит множество вспомогательных методов, которые используют функции и предикаты для выполнения таких действий, как преобразование или фильтрация всех различных типов итерируемых объектов: http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Iterables.html

Примечание. Я понимаю, что Pangea уже разместила ссылку на Google Guava выше, но я уже начал писать этот пост и подумал, что было бы полезно предоставить ссылки.

person Bryan Irace    schedule 23.01.2011