Apache Commons Functor (далее [functor]) — это компонент Apache Commons, который предоставляет API функционального программирования и несколько реализованных шаблонов (посетитель, генератор, агрегатор и т. Д.). Java 8 имеет несколько приятных новых функций, включая лямбда-выражения и функциональные интерфейсы .
В Java 8 лямбда-выражения или лямбда-выражения являются замыканиями, которые можно оценивать и вести себя как анонимные методы.
Функциональные интерфейсы — это интерфейсы только с одним методом. Эти интерфейсы можно использовать в лямбдах и сэкономить много времени от написания анонимных классов или даже реализации интерфейсов. [functor] предоставляет несколько функциональных интерфейсов (спасибо Мэтту Бенсону ). Он еще не выпущен, но есть несколько новых примеров на сайте проекта, в стволе SVN .
Я буду использовать один из этих примеров, чтобы показать, как функциональные интерфейсы [functor] могут использоваться в сочетании с лямбдами Java 8. После примера с [functor] в Java 8 я объясню, как я запускаю Java 8 в Eclipse (это отчасти gambiarra , но работает хорошо).
[functor] пример
Вот простой пример с одним предикатом.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
List numbers = Arrays.asList( 1 , 2 , 3 , 4 ); UnaryPredicate isEven = new UnaryPredicate () { public boolean test(Integer obj) { return obj % 2 == 0 ; } }; for ( Integer number : numbers ) { if (isEven.test(number)) { System.out.print(number + ' ' ); } } |
Он печатает только четные числа, те, которые проходят тест на предикаты.
[functor] пример с лямбдами
Эта модифицированная версия использует Java 8 лямбды
1
2
3
4
5
6
7
8
9
|
List numbers = Arrays.asList( 1 , 2 , 3 , 4 ); UnaryPredicate isEven = (Integer obj) -> { return obj % 2 == 0 ; }; for ( Integer number : numbers ) { if (isEven.test(number)) { System.out.print(number + " " ); } } |
Поведение такое же. UnaryPredicate — это функциональный интерфейс. Единственный метод — boolean test(A obj);
, А при использовании в лямбда-выражении вам просто нужно предоставить правильное количество аргументов и реализовать код замыкания.
Разница в двух фрагментах кода заключается в способе создания UnaryPredicate для четных чисел. Ниже вы можете увидеть два способа создания этого предиката, с лямбдами Java 8 и без них.
1
2
3
4
5
6
7
8
9
|
// pre-java-8 UnaryPredicate isEven = new UnaryPredicate() { public boolean test(Integer obj) { return obj % 2 == 0 ; } }; // with lambda-8 UnaryPredicate isEven = (Integer obj) -> { return obj % 2 == 0 ; }; |
Java 8 в Eclipse
Eclipse 8 не поддерживает Java 8, поэтому вам нужно создать новый компоновщик, чтобы Eclipse компилировал исходные тексты вашего проекта. Полное пошаговое руководство по настройке Eclipse Juno и Java 8 см. По адресу http://tuhrig.de/?p=921 . Я кратко опишу шаги здесь и покажу, как включить [functor] jar в путь к классам проекта.
- Загрузите JDK с http://jdk8.java.net/lambda и установите его (я установил в /opt/java/jdk1.8.0 )
- Создайте новый проект Java в Eclipse ( попробуйте lambdas в моем случае)
- Отключите Java Builder по умолчанию из своего проекта Eclipse, так как он не работает с Java 8
- Создайте нового строителя. Когда появится запрос с экраном, который позволяет вам искать программу, выберите Java 8 javac (для меня это был /opt/java/jdk1.8.0/bin/javac )
- Добавьте аргументы ниже вашему строителю:
1234
-classpath %CLASSPATH%;commons-functor-
1.0
-SNAPSHOT-jar-with-dependencies.jar;.
-source
8
-d ${workspace_loc:/lambdas}/bin
${workspace_loc:/Java8}/src/lambdas/*.java
Вы должны включить jar [functor], а также его зависимости. Для удобства я использовал maven-assembly-plugin для генерации jar с зависимостями для [functor]. Код и jar доступны из этого репозитория GitHub . Или, если вы предпочитаете создавать свой собственный [functor] jar с зависимостями, посмотрите код из репозитория, как показано ниже.
1
|
svn checkout https: //svn.apache.org/repos/asf/commons/sandbox/functor/trunk/ commons-functor |
И, наконец, включите следующее в [functor] pom.xml перед запуском mvn clean assembly:assembly
.
1
2
3
4
5
6
7
8
9
|
< plugin > < artifactId >maven-assembly-plugin</ artifactId > < version >2.3</ version > < configuration > < descriptorRefs > < descriptorRef >jar-with-dependencies</ descriptorRef > </ descriptorRefs > </ configuration > </ plugin > |
Ссылка: Использование функциональных интерфейсов Apache Commons Functor с лямбдами Java 8 от нашего партнера по JCG Бруно Киношита в блоге Kinoshita .