java lambda函数_番石榴函数和Java 8 Lambdas

java lambda函数

我最近阅读了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,来自Random Thoughts On Coding博客。

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

java lambda函数

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

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

相关文章

c++组合 聚合 关联

组合和聚合区别(不能脱离整体 能脱离整体) 组合&#xff1a;&#xff08;表示两个对象之间是整体和部分的强关系&#xff0c;部分的生命周期不能超越整体。如人和脑袋&#xff09; 比如A类中包含B类的一个引用b&#xff0c;当A类的一个对象消亡时&#xff0c;b这个引用所指向的…

python内建时间模块 time和datetime

时间模块 UTC&#xff08;Coordinated Universal Time&#xff0c;世界协调时&#xff09;亦即格林威治天文时间&#xff0c;世界标准时间。在中国为UTC8。DST&#xff08;Daylight Saving Time&#xff09;即夏令时。 在Python中,通常有这几种方式来表示时间&#xff1a;1&…

java tomcat自动安装教程_Tomcat:基础安装和使用教程

背景此文记录了 Tomcat 的基本使用方法&#xff0c;主要为了强化记忆。安装步骤第一步&#xff1a;下载和安装 Java安装并设置JAVA_HOME环境变量&#xff1a;第二步&#xff1a;下载和解压 Tomcat第三步&#xff1a;修改端口号.NET 我使用的是 80xx&#xff0c;Php 我使用的是 …

C++ 智能指针五

/* 代码分析:这是标准库的源码&#xff0c;我们看到在enable_shared_from_this内部保存了一个weak_ptr。shared_from_this函数就是通过这个weak_ptr得到了。 但是另外一点&#xff0c;我们可以看到在enable_shared_from_this的构造函数中并没有对这个weak_ptr进行初始化。 这就…

多线程之间共享的资源有哪些

搜集了一下资料&#xff0c;网上的说法众说纷纭&#xff1b;曾经以为进程、线程的问题搞得很清楚&#xff0c;现在感觉似乎有些复杂&#xff1a; 课本的说法&#xff1a;进程是资源分配的基本单位&#xff1b;线程是系统调度的基本单位。平时我们写的程序都是作为线程运行的&am…

mybatis一级缓存导致sql查询出现问题

如下代码&#xff1a; PubPsndoc pubdoc pubPsndocDAOService.selectByPrimaryKey(in.id);pubdoc.setPkCorp(newpkcorp);pubdoc.setPkDept(newpkdept);pubPsndocDAOService.update(pubdoc); PubPsndoc personPubdoc pubPsndocDAOService.selectByPrimaryKey(in.id); 在上述代…

使用JavaParser从源文件中提取JavaDoc文档

很多人正在使用JavaParser实现最不同的目标。 其中之一是提取文档。 在这篇简短的文章中&#xff0c;我们将看到如何打印与类或接口关联的所有JavaDoc注释。 可以在GitHub上找到代码&#xff1a; https : //github.com/ftomassetti/javadoc-extractor 获取类的所有Javadoc注释…

三个打印函数printf()/sprintf()/snprintf()区别

先贴上其函数原型 printf( const char *format, ...) 格式化输出字符串&#xff0c;默认输出到终端-----stdout sprintf(char *dest, const char *format,...) 格式化输出字符串到指定的缓冲区 snprintf(char *dest, size_t size,const char *format,...) 按指定的S…

JAVA客户端数据传输_java模拟TCP通信实现客户端上传文件到服务器端

java模拟TCP通信实现客户端上传文件到服务器端&#xff0c;供大家参考&#xff0c;具体内容如下客户端package com.zr;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;import jav…

js闭包简单演示

function f1() { var age 20; var height 170; function f2() { console.log("aaa:"(age) "--bbb:"height); } return f2; } var ff f1(); var fa f1(); fa(); fa(); ff(); ff(); 这里有两个闭包&#xff0c;fa和ff分别保存的信息独立&#xff0c;age…

C++ 类成员引用变量的使用

出来工作后&#xff0c;才发现原来C的类成员变量可以是引用变量。下面通过一个例子来说明&#xff08;虽然没多大意义&#xff09;&#xff1a; #include <iostream> using namespace std; class A { public: A(int i3):m_i(i){} void print() { c…

java 课程设计表达式求值_NYOJ-35-表达式求值

NYOJ-35-表达式求值很好的一题&#xff0c;利用栈来计算表达式的值四则运算的规则&#xff1a;1.先乘除,后加减&#xff1b;2.从左算到右&#xff1b;3.先括号内,后括号外注意把字符串转换成浮点数可以使用atof函数#include#include#includeint map[7][7] //算符间的优先关系,1…

打破冷漠僵局文章_研究僵局–第3部分

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

springboot 静态资源访问,和文件上传 ,以及路径问题

springboot 静态资源访问: 这是springboot 默认的静态资源访问路径 访问顺序依次从前到后&#xff08;http://localhost:8080/bb.jpg&#xff09; spring.resources.static-locations classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/p…

mysql jdbc链接配置文件_Java JDBC使用配置文件连接数据库

Java JDBC使用配置文件连接数据库&#xff1a;创建后缀名为&#xff1a;.properties的文件&#xff0c;文件内容包括&#xff0c;数据库驱动、连接的数据库地址、用户名、密码……以Mysql为例创建config.properties配置文件其内容如下&#xff1a;DRIVER_CLASScom.mysql.jdbc.D…

单例模式(饿汉式和懒汉式)

以前学习单例的时候&#xff0c;只理解了简单部分。这次看DRP&#xff0c;对单例的饿汉式和懒汉式有了一些认识和对比。 在实际的开发中&#xff0c;有些地方需要一个类只有一个实例。比如&#xff1a;网站在线人数的计数器&#xff0c;再比如IDE中的工具箱之类的等等。当需要这…

关于前端设置cookie

cookie既可以后端设置也可以在前端设置&#xff0c;例如登陆/注册功能&#xff0c;每次都要向服务器请求用户数据&#xff0c;这种就可以把cookie放到前端储存起来。 当网页要发http请求时&#xff0c;浏览器会先检查是否有相应的cookie&#xff0c;有则自动添加在request head…

使用React,Spring Boot和用户身份验证构建CRUD应用程序

建筑物身份管理&#xff0c;包括身份验证和授权&#xff1f; 尝试Stormpath&#xff01; 我们的REST API和强大的Java SDK支持可以消除您的安全风险&#xff0c;并且可以在几分钟内实现。 注册 &#xff0c;再也不会建立auth了&#xff01; React是用于创建Web应用程序前端的最…

java基本数据类型所占长度_java基本数据类型长度详解

java基本数据类型基础知识机器数和真值机器数一个数在计算机中的二进制表示形式,叫做这个数的机器数机器数是带符号的&#xff0c;在计算机用一个数的最高位存放符号, 正数为0, 负数为1例如:dec 3 bit 00000011dec -3 bit 10000011真值将带符号位的机器数对应的真正数值称为机…

解释型语言和编译型语言的区别

解释型语言和编译型语言的区别 首先&#xff0c;我们编程都是用的高级语言(写汇编和机器语言的大牛们除外)&#xff0c;计算机不能直接理解高级语言&#xff0c;只能理解和运行机器语言&#xff0c;所以必须要把高级语言翻译成机器语言&#xff0c;计算机才能运行高级语言所编写…