Java 8:测试Lambda水

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372196.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java定义js函数_JS中可以先使用函数,然后再定义.

首先要说明的,下面这种方式是对的,虽然不知道为什么,很奇怪为什么可以先使用,再定义,希望有了解的人可以给个说法.hello(www.openj.cn);function hello(name){alert("hello " name)};本文首发于 http://blog.openj.cn下面的这种定义函数方式,对于写一些比较复杂的代码…

基于阀值的工作流引擎设计

最近在做工作流处理流程部分的工作&#xff0c;顺便研究了一下工作流引擎的一些设计理念和原理。由于以前接触过人工智能神经网络的一些东西&#xff0c;发现工作流引擎和神经网络还是颇有一些相似之处&#xff0c;都是满足一定的条件下向下一个节点传递。在神经网络的神经元中…

Git之安装管理

1.Git安装部署 Git是分布式的版本控制系统&#xff0c;我们只要有了一个原始Git版本仓库&#xff0c;就可以让其他主机克隆走这个原始版本仓库&#xff0c;从而使得一个Git版本仓库可以被同时分布到不同的主机之上&#xff0c;并且每台主机的版本库都是一样的&#xff0c;没有主…

Java执行程序服务类型

ExecutorService功能是Java 5附带的。它扩展了Executor接口&#xff0c;并提供了线程池功能来执行异步简短任务。 使用Java 6提供的ExecutorService接口有五种异步执行任务的方法。 ExecutorService execService Executors.newCachedThreadPool&#xff08;&#xff09;; 这…

MySQL的主动优化和被动优化_MySQL“被动”性能优化汇总!

年少不知优化苦&#xff0c;遇坑方知优化难。 ——村口王大爷本文内容导图如下&#xff1a;我之前有很多文章都在讲性能优化的问题&#xff0c;比如下面这些&#xff1a;当然&#xff0c;本篇也是关于性能优化的&#xff0c;那性能优化就应该一把梭子吗&#xff1f;还是要符合一…

python2

一、管理库的安装 安装pip 提示报错&#xff1a;安装pip提示No module named setuptools Windows环境下Python默认是没有安装setuptools这个模块的&#xff0c;这也是一个第三方模块。下载地址为http://pypi.python.org/pypi/setuptools。下载后直接运行ez_setup.py 参考地址&…

Java Mybatis

Mybatis转载于:https://www.cnblogs.com/leading-index/p/6853031.html

Java例外:java lang NoSuchMethodError

如果查看错误消息java.lang.NoSuchMethodError&#xff0c;您可能会理解Java虚拟机正在尝试向我们表明您调用的方法在类或接口中不可用。 您还可能在执行没有公共static void main&#xff08;&#xff09;方法的类时抛出此错误。要了解其背后的原因&#xff0c;请阅读本文。 …

【图】最短路径——Floyed算法和Dijkstra算法

最短路径问题(floyed.cpp dijkstra.cpp) 题目描述平面上有n个点(n<100)&#xff0c;每个点的坐标均在-10000&#xff5e;10000之间。其中的一些点之间有连线。若有连线&#xff0c;则表示可从一个点到达另一个点&#xff0c;即两点间有通路&#xff0c;通路的距离为两点间的…

java的empty_Java Stack empty()方法与示例

堆栈类empty()方法empty()方法在java.util包中可用。empty()方法用于检查此堆栈是否为空。empty()方法是一个非静态方法&#xff0c;只能通过类对象访问&#xff0c;如果尝试使用类名称访问该方法&#xff0c;则会收到错误消息。在检查空状态时&#xff0c;empty()方法不会引发…

Java并发– CyclicBarrier示例

Java中的CyclicBarrier是JDK 5中java.util.Concurrent包中引入的同步器&#xff0c;以及其他并发实用程序&#xff08;如Counting Semaphore &#xff0c; BlockingQueue &#xff0c; ConcurrentHashMap等&#xff09;。CyclicBarrier与CountDownLatch类似&#xff0c;我们在上…

java i o总结_Java I/O 总结

一、IO流的三种分类方式1.按流的方向分为&#xff1a;输入流和输出流2.按流的数据单位不同分为&#xff1a;字节流和字符流3.按流的功能不同分为&#xff1a;节点流和处理流二、IO流的四大抽象类&#xff1a;字符流&#xff1a;Reader Writer字节流&#xff1a;InputStream(读数…

try...catch 语句

一般情况下&#xff0c;我们很少用到 try...catch 语句&#xff0c;但是有时候为了测试代码中的错误&#xff0c;也有可能会用到。小白我也在工作中用到过。那么好的程序设计&#xff0c;什么时候会用到呢&#xff1f; try...catch 一般用来捕获宿主对象或者ECMAScript抛出的异…

用Mockito回答

在编写单元测试时 &#xff0c;必须牢记不要依赖外部组件。 为了避免这种情况&#xff0c;我们使用了模拟框架&#xff0c;对我来说&#xff0c;最容易使用的是Mockito 。 在本文中&#xff0c;我们将看到在Mockito中使用的一种“高级”技术&#xff0c;可以使用Answer接口在模…

java三板斧_Java 枚举使用三板斧

Java 枚举使用三板斧1 定义public enum CountryEnums {ONE(1,"韩"),TWO(2,"魏"),THREE(3,"楚"),FOUR(4,"燕"),FIVE(5,"赵"),SIX(6,"齐");private Integer retCode;private String retMsg;// 枚举的构造方法是 pri…

假装这些是MyEclipse的快捷键(1)

Java快捷键 Alt / 代码自动补全Alt Shift S 功能菜单 Ctrl 1 代码自动修正Ctrl / 单行注释/取消Ctrl O 查看类的所有方法Ctrl T 查看类的集成架构图Ctrl Shift / 多行注释Ctrl Shift \ 取消多行注释Ctrl Shift F 代码格式化转载于:https://www.cnblogs.com/swordt…

JasperReports JSF插件用例–简单列表报告

这是JasperReports JSF插件系列的第一篇“用例文章” &#xff0c;我将专注于一个简单的需求&#xff0c;并且我将进一步深入。 起点是我们已经为图书商店完成的项目设置&#xff0c;我将向其中添加一个列表&#xff0c;其中包含在数据库中注册的其他图书&#xff0c;该列表也将…

2016.10.17先占坑

2016.10.17先占坑转载于:https://www.cnblogs.com/amurzet/p/5978986.html

ER图流程图

ER图&#xff1a;ER图分为实体、属性、关系三个核心部分。实体是长方形体现&#xff0c;而属性则是椭圆形&#xff0c;关系为菱形。 图书馆管理系统流程图&#xff08;图片源于网上&#xff09;&#xff1a;对于程序员来说&#xff0c;我们要知道&#xff1a;整个系统中&#x…

php源码仿三一重工,织梦仿三一重工业大学气企业网站php源码

★模板引荐★源码称呼&#xff1a;仿三一重工业大学气企业网站php源码仿三一重工业大学气企业网站php源码&#xff0c;尝试完备无错&#xff0c;兼容合流欣赏器。模板包括安置证明&#xff0c;并包括尝试数据。本模板鉴于DEDECms 5.7 GBK安排&#xff0c;须要 UTF-8版本的请本人…