Java 8大约有一年的时间了,它具有我非常期待的语言功能: Lambda Expression 。 令人遗憾的是,另一个重要功能Java平台模块已延迟到Java9。但是,将lambda表达式(或闭包)添加到该语言中将使Java编程变得更好。

大约有一年的时间了-但是随着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

Java 8:测试Lambda水相关推荐

  1. java junit 异常_JUnit:使用Java 8和Lambda表达式测试异常

    java junit 异常 在JUnit中,有许多方法可以在测试代码中测试异常,包括try-catch idiom JUnit @Rule和catch-exception库. 从Java 8开始,我们 ...

  2. JUnit:使用Java 8和Lambda表达式测试异常

    在JUnit中,有许多方法可以在测试代码中测试异常,包括try-catch idiom JUnit @Rule和catch-exception库. 从Java 8开始,我们还有另一种处理异常的方法:使 ...

  3. Java forEach中 Lambda Expr中的 final变量要求

    https://my.oschina.net/wadelau/blog/1859419 Java forEach中 Lambda Expr中的 final变量要求 Java8闭包 闭包是一个函数在创建 ...

  4. 如何使用Java创建AWS Lambda函数

    在本教程中,我们将看到如何在Java中创建AWS Lambda函数,我告诉你,这样做非常容易-- 基本上,我们可以通过三种方式创建AWS Lambda函数: –通过实现RequestHandler接口 ...

  5. 带有Java 8,lambda表达式和Mockito-Java8附加组件的更紧凑的Mockito

    Mockito-Java8是一组Mockito附加组件,它们利用Java 8和lambda表达式使Mockito的模拟更加紧凑. 在2015年初,我进行了简短的演讲, Java 8为测试带来了力量! ...

  6. Java 8 新增lambda表达式(-)

    2019独角兽企业重金招聘Python工程师标准>>> Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性 ...

  7. Java箭头函数,lambda函数

    Java箭头函数,lambda函数 lambda表达式实质就是一种语法糖,(建议尽量不要使用lambda表达式,代码太简洁,难懂,难以调试) lambda表达式的简单例子: 不需要参数,返回5 ()- ...

  8. java se翻译_(翻译)Java SE 8 Lambda 标准库概览(下)

    Java SE 8 Lambda 标准库概览 8,Collectors 在目前的例子中,我们已经使用了collect()方法来收集流中的元素并放入List或Set中了.collec()方法的参数是一个 ...

  9. aidl生成java文件_Android AIDL自动生成Java文件测试

    /******************************************************************************** * Android AIDL自动生成 ...

最新文章

  1. java jpanel方法,Java JPanel.putClientProperty方法代码示例
  2. 斐波那契数列及其优化
  3. 小米功能机支持java吗_小米竟然卖功能机了!2.8吋/15天超长待机
  4. Linux 内核101:[译]地址空间发展简史
  5. dnn神经网络_卷积神经网络(五):总结
  6. wireshark display reference: https://www.wireshark.org/docs/dfref/
  7. ubuntu 版mysql客户端工具_mysql linux版下载
  8. 计算机仿真软件在医疗应用,医学虚拟仿真应用介绍
  9. 2021年UI设计风格新风向新趋势,赶紧收藏!
  10. 计算机自我鉴定高中生200字,精编高中生自我鉴定200字左右3篇 高中自我鉴定200字...
  11. 稀奇古怪--JAVA篇
  12. Android studio @Author的使用以及TAG的自动生成
  13. Guawa的Splitter的工具类
  14. 信息编码的运用——如何用二进制改图
  15. qq里面cap字符_qq字符
  16. HTML5 影音 ( Video ) 概論
  17. 央视“解禁”播《V字别动队》 电影全面解析
  18. android hero动画,主动画 (Hero animations)
  19. 数据库 第一章 绪论
  20. 硅片/SOI绝缘硅片介绍,SOI圆片特点

热门文章

  1. leetcode初级算法1.删除排序数组中的重复项
  2. JavaWeb核心常用API一览
  3. apache ignite_Kubernetes集群上的Apache Ignite和Spring第1部分:Spring Boot应用程序
  4. Spring Hibernate教程
  5. lucene 查询示例_高级Lucene查询示例
  6. lambda 延迟执行_Java Lambdas和低延迟
  7. mysql查询会话池_用户会话,数据控件和AM池
  8. 限定通配符和非限定通配符_为什么我不信任通配符以及为什么我们仍然需要通配符...
  9. 硒测试可实现有效的测试自动化
  10. JDK 14的征兆开始出现