大约有一年的时间了-但是随着Java是现在开源的,我们可以看看并立即尝试使用它。 所以走吧!
下载并安装启用Lambda的Java 8
首先,我希望我必须自己编译Java 8,因为它尚未发布。 但是令我感到惊讶的是,在http://jdk8.java.net/lambda/上有适用于所有平台的二进制版本。 因此,我只是下载了最新的开发人员预览版本并将其安装在我的计算机上。
为确保其正常工作,我创建了一个包含“ Hello,World!”的LambdaIntro类,并对其进行了编译和执行:
~ $ export JAVA_HOME=~/Devtools/Java/jdk1.8.0/
~ $ cd spikes/lambda-water
~ $ $JAVA_HOME/bin/javac src/net/jthoenes/blog/spike/lambda/LambdaIntro.java
~ $ $JAVA_HOME/bin/java -cp src net.jthoenes.blog.spike.lambda.LambdaIntro
Hello from Java 8!
注意 :我使用命令行在此处进行编译和执行,因为IDE到目前为止不支持Java 8。
非lambda方式
作为示例,假设我要遍历对象列表。 但是对于我的业务逻辑,我需要具有列表项的值和索引。 如果要使用当前的Java,则必须处理索引以及实际的逻辑:
List list = Arrays.asList('A', 'B', 'C');
for (int index = 0; index < list.size(); index++) { String value = list.get(index); String output = String.format('%d -> %s', index, value);
System.out.println(output);
}
这将输出
0 -> A
1 -> B
2 -> C
这还不错,但是我在几行代码中做了两件事:控制迭代并提供一些(非常简单的)业务逻辑。 Lambda表达式可以帮助我将两者分开。\
eachWithIndex方法签名
所以我想有一个方法eachWithIndex ,可以这样调用:
List list = Arrays.asList('A', 'B', 'C');
eachWithIndex(list,
(value, index) -> {
String output = String.format('%d -> %s', index, value);
System.out.println(output);
}
);
该方法接收两个参数。 第一个是列表,第二个是lambda表达式或闭包,它指示方法如何处理每个列表项。 正如您在第3行中看到的那样,lambda表达式收到两个参数:当前值和当前索引。 这些参数没有类型声明。 类型信息将由Java 8编译器推断。 在参数之后,有一个->和一个代码块,应为每个列表项执行。
注意 :您将必须在普通的文本编辑器中编写此方法,或者忽略IDE中的错误消息。
实现eachWithIndex方法
要在Java 8中使用lambda,您需要声明一个功能接口。 功能接口是仅具有一种方法的接口,该方法将由lambda表达式实现。 在这种情况下,我需要声明一个方法,该方法接收项目和索引,但不返回任何内容。 因此,我定义了以下接口:
public static interface ItemWithIndexVisitor<E> {
public void visit(E item, int index);
}
现在,通过此接口,我可以实现eachWithIndex方法。
public static <E> void eachWithIndex(List<E> list, ItemWithIndexVisitor<E> visitor) {
for (int i = 0; i < list.size(); i++) {
visitor.visit(list.get(i), i);
}
}
该方法利用通用参数<E> ,因此将推断传递给visit方法的项目与列表具有相同的类型。
使用功能接口的好处是,Java中已经有很多接口了。 考虑一下java.util.concurrent.Callable接口的示例。 它可以用作lambda,而不必更改使用Callable的代码。 这使得默认情况下启用了许多JDK和框架lambda。
使用方法参考
来自Lambda项目的一件方便的事情是方法引用。 它们是重用现有方法并将其打包到功能接口对象中的一种方法。 所以说我有以下方法
public static <E> void printItem(E value, int index) {
String output = String.format('%d -> %s', index, value);
System.out.println(output);
}
而且我想在我的eachWithIndex方法中使用此方法,而不是可以在方法调用中使用::符号:
eachWithIndex(list, LambdaIntro::printItem);
看起来很简洁,不是吗?
摘要
这使我的第一个lambda示例得以运行。 在渴望了很长时间之后,我无法回避地笑着看到关闭在我的一个Java程序中运行。 Lambda Expression当前仅可用于开发人员预览版本。 如果您想了解更多信息,请阅读当前的Early Draft Review或转到Project Lambda项目页面。
我将完整的示例代码上传到gist 。
参考: Java 8:在Johannes Thoenes博客博客上从JCG合作伙伴 Johannes Thoenes 测试Lambda Water 。
翻译自: https://www.javacodegeeks.com/2012/08/java-8-testing-lambda-water.html