Статьи

Использование функциональных интерфейсов Apache Commons Functor с лямбдами Java 8

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 )
  • Добавьте аргументы ниже вашему строителю:
    1
    2
    3
    4
    -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 .