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-8UnaryPredicate isEven = new UnaryPredicate() { public boolean test(Integer obj) { return obj % 2 == 0; }}; // with lambda-8UnaryPredicate 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;.-source8-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 .