Ламбда изрази на .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
Не разбирам едно нещо, Lambda изразът е патентован от 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 на C#. Имах предвид SomeCollection.ForEach(closure). По-късната част от отговора обаче е полезна, въпреки че 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