番石榴函数和Java 8 Lambdas

我最近阅读了Brian Goetz的《 Lambda的状况》 ,在阅读了该文章之后,我想尝试使用Java 8 Lambda表达式。 Brian在他的文章中继续描述了将一种方法称为“功能”接口的接口。 功能接口几乎总是用作匿名类,其中ActionListener是规范示例。 这些“功能性”界面是lambda表达式的最初目标,主要目标是删除许多使用它们的样板或仪式。 当我在Guava库上编写系列文章时,立即想到了Function接口,它是尝试使用lambda表达式的主要候选对象。

我的目标很简单,从我的Guava Futures博客中进行单元测试(它大量使用Function接口)并将其转换为使用lambda表达式。 虽然我将介绍与所举示例有关的lamba表达式的结构,但本文并非是有关Java 8 lambda表达式的教程。 而是记录了我在Java中使用lambda表达式的首次尝试。

Lambda表达式

第一个示例是对Futures.chain方法的测试,该方法将Function作为参数之一:

Function<List<String>, ListenableFuture<List<Person>>> queryFunction =new Function<List<String>, ListenableFuture<List<Person>>>() {@Overridepublic ListenableFuture<List<Person>> apply(final List<String> ids) {return dbService.getPersonsByIdAsync(ids);}};ListenableFuture<List<String>> indexSearch = luceneSearcher.searchAsync('firstName:martin');
ListenableFuture<List<Person>> results = Futures.chain(indexSearch,queryFunction,executorService);

使用lamba表达式,现在看起来像:

Function<List<String>, ListenableFuture<List<Person>>> queryFunction =ids ->(dbService.getPersonsByIdAsync(ids));ListenableFuture<List<String>> indexSearch = luceneSearcher.searchAsync('firstName:martin');ListenableFuture<List<Person>>results = Futures.chain(indexSearch, queryFunction,executorService);

请记住,在上面的代码示例中,两个突出显示的部分是等效的。 让我们看一下第2行,并说明它如何与第一个代码示例中的1-7行匹配

  1. ids是apply方法的输入,并且对应于第一个代码示例中第4行的final List<String> ids参数。 lamba表达式的类型是从使用它的上下文中推断出来的,因此我们不需要为ids参数重复它们。
  2. 然后是箭头(->)令牌,它是当前形式的Java 8 lambda表达式的常规语法的一部分
  3. 然后,我们得到了lambda的主体(dbService.getPersonsByIdAsync(ids)),该主体是一个方法调用,该方法返回一个ListenableFuture,进而产生一个Person对象列表。 请注意,我们不必放入return语句,因为这是一个表达式,可以求值并返回。

下一个示例是测试中的实用程序方法,该方法通过将匿名Callable实例传递到ExecutorService中来返回ListenableFutures:

private ListenableFuture<List<Person>> getPersonsByFirstNameFuture(final String firstName, final boolean error) {
return executorService.submit(new Callable<List<Person>>() {@Overridepublic List<Person> call() throws Exception {startSignal.await();if (error) {throw new RuntimeException('Ooops!');}List<String> ids = luceneSearcher.search('firstName:' + firstName);return dbService.getPersonsById(ids);}});
}

这是使用lambda表达式的等效项:

private ListenableFuture<List<Person>> getPersonsByFirstNameFuture(final String firstName, final boolean error) {return executorService.submit(() -> {startSignal.await();if (error) {throw new RuntimeException('Ooops!');}List<String> ids = luceneSearcher.search('firstName:' + firstName);return dbService.getPersonsById(ids);});
}

在此示例中,没有输入参数,因此表达式在第2行以空括号()开头。存在->标记,但是在此示例中,主体包含由{…}包围的多个语句。 由于存在多个语句,因此在第7行需要显式return语句。

运行Java 8的环境

我当前的笔记本电脑是MacBook Pro,因此我需要设置一个环境以运行具有lambda支持的Java 8。 这是我采取的步骤:

  1. 在VirtualBox上安装了LinuxMint 12。
  2. 创建一个目录并与LinuxMint来宾共享
  3. 安装了Java 8的开发人员预览版 。
  4. 为了从现有的maven项目中获取源代码并测试源代码,我运行了mvn jar:jar jar:test-jar并将生成的jar文件放在共享目录中
  5. 将所有依赖项放在共享目录中(guava,lucene,h2和junit)
  6. 重新编写单元测试以使用lambda,并从命令行运行新测试

结论

尽管要发布支持lambda的Java 8尚需时日,但开发人员预览版中提供的功能似乎很有希望。感谢您的时间,一如既往地欢迎提出意见和建议

资源资源

  • Lambda的状态,第4部分
  • Java 8开发人员预览
  • 这篇文章的源代码
  • 番石榴项目首页
  • Guava博客系列的源代码


参考:来自我们的JCG合作伙伴 Bill Bejeck的Guava Functions&Java 8 Lambdas,来自“ 随机编码思考”博客。

翻译自: https://www.javacodegeeks.com/2012/11/guava-functions-java-8-lambdas.html

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

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

相关文章

linux rsync删文件速度,为什么用rsync删除大量文件的时候比用rm快

为什么用rsync删除大量文件的时候比用rm快今天研究怎么在Linux下快速删除大量文件&#xff0c;搜到很多人都说可以用rsync来删除大量文件&#xff0c;速度比rm要快很多&#xff0c;但是没有人说为什么&#xff0c;仔细研究了一下原因&#xff0c;总结起来大概就是&#xff0c;一…

关于源码,反码,补码(正数--负数)---------(-128)自己的理解

以一个字节为例 1、无符号位&#xff0c;一个字节可以存放0~255共256个数字&#xff1b;有符号位存放-128~127共256个数字&#xff1b; 2、无符号全都表示为正数&#xff1b;有符号位则首位表示正负数&#xff0c;正数首位为0&#xff0c;负数首位为1&#xff08;因此在判断一个…

英特尔x722网卡驱动_产品详情 | 从核心到边缘,英特尔加速5G网络基础设施建设...

英特尔近期宣布推出无可比拟的5G基础设施芯片产品组合&#xff0c;包括一款面向无线基站的10纳米片上系统(SoC)英特尔凌动P5900&#xff0c;和一款面向5G网络处理的结构化ASIC&#xff0c;一款针对5G网络优化、提供基于GPS的高精度网络服务同步功能的以太网适配器。此外&#x…

canvas离屏技术与放大镜实现

教程所示图片使用的是 github 仓库图片&#xff0c;网速过慢的朋友请移步>>> &#xff08;原文&#xff09;canvas 离屏技术与放大镜实现。 更多讨论或者错误提交&#xff0c;也请移步。 利用canvas除了可以实现滤镜&#xff0c;还可以利用离屏技术放大镜功能。为了方…

虚拟机下安装ubuntu后root密码设置

问题描述&#xff1a; 在虚拟机下安装了ubuntu中要输入用户名&#xff0c;一般情况下大家都会输入一个自己的网名或绰号之类的&#xff0c;密码也在这时设置过了。 但是当安装成功之后&#xff0c;使用命令#su root&#xff0c;然后输入刚才设置的密码&#xff0c;发现密码错误…

使用Ajax的Spring MVC REST调用

这篇文章提供了对Spring MVC Web应用程序的REST调用的简单示例。 它基于在Spring MVC上下文示例中使用Spring MVC服务静态资源和使用Ajax获取JSON 。 该代码可在GitHub的Spring-REST-With-Ajax目录中找到。 主页 我们的主页包含与执行Ajax调用的Javascript函数链接的四个按钮…

团队作业—预则立他山之石

团队作业—预则立&&他山之石 Deadline: 2017.10.24 22:00pm 作业要求 一、确立团队选题&#xff0c;建立和初步熟悉团队git的协作方式。项目后续的代码、文档都要通过github增量式管理。实现文档的版本化和增量式管理。 二、初步确立团队任务计划&#xff0c;将团队的任…

linux7系统如何配置网卡,Linux 7 配置网卡(nmcli)

操作系统版本&#xff1a;[rootcjcos01 network-scripts]# cat /etc/redhat-releaseRed Hat Enterprise Linux Server release 7.5 (Maipo)查看网卡、IP等信息&#xff1a;[rootcjcos01 ~]# ifconfigenp0s3: flags4163 mtu 1500inet 192.168.1.90 netmask 255.255.255.0 bro…

学以致用深入浅出数字信号处理 pdf_数字阵列雷达--相控阵专题讲座之三

数字阵列雷达-相控阵专题讲座之三https://www.zhihu.com/video/1218562626877583360从名词上看&#xff0c;数字阵列雷达&#xff0c;肯定是阵列雷达了&#xff0c;那么数字阵列与传统的相控阵雷达又有什么区别呢&#xff1f;传统的相控阵雷达&#xff0c;是依靠移相器、衰减器…

Ubuntu中右击出现终端

1 root用户 $sudo apt-get install nautilus-open-terminal 2重启 3ok 转载于:https://www.cnblogs.com/lanjianhappy/p/6761599.html

MapReduce:处理数据密集型文本处理–局部聚合第二部分

这篇文章继续进行有关使用MapReduce进行数据密集型处理的书中实现算法的系列文章。 第一部分可以在这里找到。 在上一篇文章中&#xff0c;我们讨论了使用本地聚合技术来减少通过网络进行混洗和传输的数据量的方法。 减少传输的数据量是提高MapReduce作业效率的主要方法之一。 …

python爬虫需要什么知识-学习Python爬虫技术,需要掌握哪些web端的知识?

HTML5&#xff1a;html概述和基本结构、html标题标签、html段落标签、换行标签、块标签、图片标签、a链接标签、列表标签、表格、表单、页面布局等。 CSS3&#xff1a;CSS基本语法和页面引用、CSS文本设置、颜色表示法、CSS选择器、盒子模型、盒子模型实际尺寸、浮动、四大定位…

UDP学习总结

1、UDP的优势是什么&#xff1f;有哪些典型的应用是使用UDP的&#xff1f;为什么&#xff1f; 2、转载于:https://www.cnblogs.com/zhouhaibing/p/7669251.html

Linux版本的SVN客户端,linux 下安装 subversion(svn) 客户端

svn server 为只支持http://协议的windows;test web server 为as4,现需安装svn客户端方便同步代码网上找了下都是讲如何安装svn server的&#xff0c;我只需要一个支持http协议的客户端哈&#xff0c;不想装apache。安装所需软件apr,apr-util,sqlite,neon,subversion1.下载软件…

使用bootstrap的dropdown部件时报错:error:Bootstrap dropdown require Popper.js

前言&#xff1a;前端小白一枚&#xff0c;刚注册博客&#xff0c;先发个学习过程中新碰到小问题试试水吧~ 摘要&#xff1a;最近在学习bootstrap&#xff0c;偶然碰到了一个小问题&#xff0c;bootstrap网站也没有做过多的解释&#xff0c;今天分享给大家。 问题描述&#x…

C#中的三层

三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为&#xff1a;界面层&#xff08;User Interface layer&#xff09;、业务逻辑层&#xff08;Business Logic Layer&#xff09;、数据访问层&#xff08;Data access layer&#xff09;。区分层次的…

研究僵局–第3部分

在本系列的前两个博客&#xff08; 第1部分和第2部分&#xff09;中 &#xff0c;我演示了如何创建一段死锁的不良代码&#xff0c;然后使用该代码展示了进行线程转储的三种方式。 在这个博客中&#xff0c;我将分析线程转储以找出错误的原因。 下面的讨论同时涉及本系列第1部…

qq2009显ip版怎么用_毛孔粗大怎么破?用对方法,轻松改善显皮肤嫩滑

脸上毛孔粗大怎么破&#xff1f;超级烦恼尤其是一到秋季脸上经常油腻腻的为什么会毛孔粗大呢&#xff1f;毛孔粗大怎么破&#xff1f;用对方法&#xff0c;轻松改善显皮肤嫩滑 当皮肤老旧角质积聚越多&#xff0c;会使肌肤变厚、变粗糙&#xff0c;毛孔变粗大&#xff0c;肌肤也…

linux 账号密码 字段,详解Linux中的用户密码管理命令passwd和change

passwd修改用户密码参数-k 保持未过期身份验证令牌-l 关闭账号密码。效果相当于usermod -L&#xff0c;只有root才有权使用此项。-u 恢复账号密码。效果相当于usermod -U&#xff0c;同样只有root才有权使用。-g 修改组密码。gpasswd的等效命令。-f 更改由finger命令访问的用户…

hello程序的运行过程-从计算机系统角度

hello程序的运行过程-从计算机系统角度 1、gcc编译器驱动程序读取源程序文件hello.c&#xff0c;并将它翻译成一个可执行目标文件hello。翻译过程分为四个阶段&#xff1a;预处理阶段&#xff0c;编译阶段&#xff0c;汇编阶段&#xff0c;链接阶段。 2、初始时&#xff0c;she…