Apache Commons Functor (以下稱為[functor])是一個Apache Commons組件,它提供功能性的編程API和已實現的幾種模式(訪問者,生成器,聚合器等)。 Java 8具有幾個不錯的新功能,包括lambda表達式和函數接口 。
在Java 8中,lambdas或lambdas表達式是閉包 ,可以對其求值并表現為類似于匿名方法的行為。
功能接口是僅一種方法的接口。 這些接口可以在lambda中使用,并且可以節省編寫匿名類甚至實現接口的時間。 [functor]提供了幾個功能接口(感謝Matt Benson )。 它尚未發布,但是在項目站點中, SVN的主干中有一些新示例。 我將使用這些示例之一來說明[functor]功能接口如何與Java 8 lambda結合使用。 在Java 8中帶有[functor]的示例之后,我將說明如何在Eclipse中運行Java 8(有點像gambiarra ,但效果很好)。
[functor]例子
這是一個帶有謂詞的簡單示例。
Listnumbers = Arrays.asList(1, 2, 3, 4);UnaryPredicateisEven = new UnaryPredicate() {public boolean test(Integer obj) {return obj % 2 == 0;}
};for( Integer number : numbers ) {if (isEven.test(number)) {System.out.print(number + ' ');}
}
它僅打印通過謂詞測試的那些偶數。
Lambdas的[functor]示例
此修改的版本使用Java 8 lambda
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);
。 當在lambda表達式中使用時,您只需要提供正確數量的參數并實現閉包代碼即可。
這兩個代碼段的區別在于創建偶數的UnaryPredicate的方式。 在下面,您可以看到使用和不使用Java 8 lambda的兩種創建謂詞的方法。
// 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; };
Eclipse中的Java 8
Eclipse 8不支持Java 8,因此您必須創建一個新的構建器才能使Eclipse編譯項目的源代碼。 有關如何設置Eclipse Juno和Java 8的完整分步指南,請參閱http://tuhrig.de/?p=921 。 我將在此處總結步驟,并說明如何將[functor] jar包含到項目類路徑中。
- 從http://jdk8.java.net/lambda下載JDK并安裝(我安裝在/opt/java/jdk1.8.0中 )
- 在Eclipse中創建一個新的Java項目(在我的情況下為try-lambdas )
- 從您的Eclipse項目中禁用默認的Java Builder ,因為它不適用于Java 8
- 創建一個新的生成器。 當出現允許您瀏覽程序的屏幕提示時,選擇Java 8 javac(對我來說是/opt/java/jdk1.8.0/bin/javac )
- 將以下參數添加到您的構建器中:
-classpath %CLASSPATH%;commons-functor-1.0-SNAPSHOT-jar-with-dependencies.jar;. -source 8 -d ${workspace_loc:/lambdas}/bin ${workspace_loc:/Java8}/src/lambdas/*.java
您必須包括[functor]的jar及其依賴項。 為了方便起見,我使用maven-assembly-plugin生成了一個帶有[functor]依賴項的jar。 可從此GitHub存儲庫中獲取代碼和jar。 或者,如果您希望生成具有依賴項的自己的[functor] jar,請從存儲庫中簽出代碼,如下所示。
svn checkout https://svn.apache.org/repos/asf/commons/sandbox/functor/trunk/ commons-functor
最后,在運行mvn clean assembly:assembly
之前,將以下內容包含到[functor] pom.xml中 。
<plugin><artifactId>maven-assembly-plugin</artifactId><version>2.3</version><configuration><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration>
</plugin>
參考:來自Kinoshita博客博客的JCG合作伙伴 Bruno Kinoshita 將Apache Commons Functor功能接口與Java 8 lambda結合使用 。
翻譯自: https://www.javacodegeeks.com/2012/12/using-apache-commons-functor-functional-interfaces-with-java-8-lambdas.html