百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

深入浅出:Java函数式编程中兰姆达(Lambda)的5种应用模式

yuyutoo 2024-10-20 13:09 7 浏览 0 评论

一、引言

我们知道,java函数式编程是在JDK8中引入,其主要特性支持基础函数接口、兰姆达(lambda)表达式以及流化(Stream)处理工具类等。

其中,函数接口为lambda表达式提供支持,Stream为lambda应用提供实施舞台和和应用场景。同时JDK8中,很多的特性或类库接口等也基于函数式编程做了很多的升级和补充。这方面的具体内容,这里暂且不表。这里主要介绍下函数接口和兰姆达表达式。

每个人对函数式编程的理解不尽相同。但其核心是:在思考问题时,使用不可变值和函数,函数对一个值进行处理,映射成另一个值。这句话有点抽象,不理解暂时略过。

再看看百度上的解释是:函数式编程是种编程方式,它将电脑运算视为函数的计算。函数编程语言最重要的基础是λ演算(lambda calculus),而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。简单说,"函数式编程"是一种"编程范式"(programming paradigm),也就是如何编写程序的方法论。它属于"结构化编程"的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用。

那么,这样基本可以理解所谓“函数式编程”的意思了,也有称为“闭包”或“仿函数对象”的。需要注意的是这里一个关键的概念就是“表达式”。这正是支持函数式编程的Java中Lambda表达式出现的重要意图。

在java中,支持兰姆达表达式的另一要求就是函数接口。所谓函数接口,即是只有一个抽象方法的接口,用作 Lambda 表达式的类型

因此,在java中的兰姆达表达式,你可以认为是一个又一个方法的匿名内部类,只是,lambda的处理方式更丰富了。当然,这需要多加练习才能真正理解和掌握。

这里,希望通过一系列的有关Java函数式编程的深入浅出的介绍和演示教程,使你能理解并实际应用java的函数式编程。

二、Lambda的五种应用模式

1、无参数兰姆达表达式

无参lambda表达式,一般以下面的形式应用:

Runnable noArguments = () -> System.out.println("Hello World");

上述语句形式中所示的 Lambda 表达式不包含参数,使用空括号 () 表示没有参数。该 Lambda 表达式实现了 Runnable 接口,该接口也只有一个 run 方法,没有参数,且返回类型为 void 。

如果我们想输出兰姆达表达式的结果,可以如下编写代码:

2.一参兰姆达表达式

一参Lambda表达式形式如下:

ActionListener oneArgument = event -> System.out.println("button clicked");

以上代码的传统模式如下:

上述代码即为Swing编程中GUI的典型界面操作。

换一种表达方式的示例代码如下:

3.代码块兰姆达表达式

其应用模式示例代码如下:

也就是说,Lambda 表达式的主体不仅可以是一个表达式,而且也可以是一段代码块,使用大括号( {} )将代码块括起来,如所示。该代码块和普通方法遵循的规则别无二致,可以用返回或抛出异常来退出。只有一行代码的 Lambda 表达式也可使用大括号,用以明确 Lambda表达式从何处开始、到哪里结束。

4. 多个参数的方法兰姆达表达式

其应用模式代码是示例如下:

Lambda 表达式也可以表示包含多个参数的方法,如上所示。这时就有必要思考怎样去阅读该 Lambda 表达式。这行代码并不是将两个数字相加,而是创建了一个函数,用来计算两个数字相加的结果。变量 add 的类型是 BinaryOperator<Long> ,它不是两个数字的和,而是将两个数字相加的那行代码。

BinaryOperator是JDK8提供的函数编程类,可以查看对应的API参考说明。这里不赘述了。

5.显示传递Lambda表达式参数

其应用模式代码示例如下(可以自行实现代码运行):

BinaryOperator<Long> addExplicit = (Long x, Long y) -> x + y;

到目前为止,所有 Lambda 表达式中的参数类型都是由编译器推断得出的。这当然不错,但有时最好也可以显式声明参数类型,此时就需要使用小括号将参数括起来,多个参数的情况也是如此。如上所示。

三、补充说明

通过上述几个表达式的示例可知道,Lambda 表达式的类型依赖于上下文环境,是由编译器推断出来的,也就是Lambda的目标类型(即目标类型是指 Lambda 表达式所在上下文环境的类型。比如,将 Lambda 表达式赋值给一个局部变量,或传递给一个方法作为参数,局部变量或方法参数的类型就是 Lambda 表达式的目标类型)。

另外,Lambda表达式中参数是引用值,而不是变量,就像匿名类中引用final类型的变量一样。也就是说,兰姆达表达式中的参数,必须是"既成事实上的final变量"。只是Java8中放宽了这个限制。既成事实上的 final 是指只能给该变量赋值一次。换句话说,Lambda 表达式引用的是值,而不是变量。

通过示例可以更好理解&ldquo;既成事实的final变量&rdquo;:

代码清单-1

代码清单-2

清单-1是name是"既成事实的final变量",可以正常运行;二清单-2不是,编译会出错。

相关推荐

Docker部署 chatgpt-web-midjourney-proxy:开启一站式AI与绘图

ChatGPT和Midjourney的结合无疑是创新性的突破。ChatGPT作为强大的语言模型,能够为用户提供智能的对话和文本生成服务。而Midjourney则以其出色的绘画能力,能够根据...

Cacti监控服务器配置教程(基于CentOS+Nginx+MySQL+PHP环境搭建)

具体案例:局域网内有两台主机,一台Linux、一台Windows,现在需要配置一台Cacti监控服务器对这两台主机进行监控...

那些少为人知却非常有意思好用的 Chrome 扩展

ChromeWebStoreSessionManager要睡觉了,还有网页没看完怎么办?等明天点开歷史记录重新加载?No!有这个保存当前打开的链接,下回直接打开一串网址,好顶赞有木有!!!chr...

分享一款轻量级 HTTP(S) 代理 TinyProxy

概述众所周知,我们常用的Web服务器Nginx/Apache都可以很方便的用来做为正向或反向代理服务器使用。但是它们都并不支持HTTPS的正向代理。Nginx做为正向代理不支持HT...

深入理解 WebSecurityConfigurerAdapter「源码篇」

我们继续来撸SpringSecurity源码,今天来撸一个非常重要的WebSecurityConfigurerAdapter。我们的自定义都是继承自WebSecurityConfigurer...

RPC、Web Service等几种远程监控通信方式对比

几种远程监控通信方式的介绍一.RPCRPC使用C/S方式,采用http协议,发送请求到服务器,等待服务器返回结果。这个请求包括一个参数集和一个文本集,通常形成“classname.meth...

老酒好喝,5G时代数据中心柴油发电机组以GPRS方式接入动环监控

背景:随着手机的普及,电信运营商基站越建越多,网络覆盖范围也越来越广,基本上随时随地都能通过运营商的网络上网冲浪,这给我们传统的通过有线方式实现的动环监控也提带来了新的启发:对于不具备有线传输条件的的...

为了春节红包大战,微信做了一次成功的预热!

经过上午的预告,微信在今天下午17:00正式推出了微信红包新玩法——红包照片。微信用户在朋友圈点击照片发送按钮,会看到“红包照片”选项,用户在选择发布照片之后,这张照片将被模糊处理后,再发送到朋友...

Proxy-Lite实战:3步部署+2个案例,轻松掌握轻量级网页自动化

大家好,我是何三,80后老猿,独立开发者一、Proxy-Lite模型概述...

会Python?那么你一定要试一试mitmproxy

mitmproxy是一款工具,也可以说是python的一个包,使用这个工具可以在命令行上进行抓包(现在也可以在web页面上查看上抓的数据包了),还可以对所抓到的包进行脚本处理,非常有用。和...

十大Web安全扫描工具,你知道哪些?

初入门时,喜欢将目标站点直接丢扫描器,慢慢等扫描结果,极度依赖Web扫描器;而有一些漏洞高手,善于运用运用各种工具但并不依赖工具,经常可以找到扫描工具发现不了的漏洞。一款好用的Web扫描器对于白帽子来...

鸿蒙5网页开发神器 ArkWeb:让 Web 和原生手拉手跳舞

你有没有想过,在鸿蒙应用里既能用原生代码写高性能界面,又能直接塞进一个网页?这听起来有点像把汉堡和披萨拼在一起,但ArkWeb(方舟Web)真的做到了!今天咱们就聊聊这个神奇的工具,看看它如何让...

MapReduce过程详解及其性能优化(详细)

从JVM的角度看Map和ReduceMap阶段包括:第一读数据:从HDFS读取数据1、问题:读取数据产生多少个Mapper??Mapper数据过大的话,会产生大量的小文件,由于Mapper是基于虚拟...

大数据平台建设需要掌握的14个知识

Q1、大数据分析中的实时推荐是如何实现的?@rein07某证券系统架构师:实时推荐需要使用实时处理框架结合推荐算法,从而做到对数据的实时处理和推荐。实时处理框架有Storm、Flink、Spark...

HDFS可视化管理系统设计与实现(hdfs的可靠性设计,主要依靠哪些机制来实现)

摘要:Hadoop工具核心模块包括分布式文件系统(HadoopDistributedFileSystem,HDFS)和分布式编程模型MapReduce,其中HDFS是Hadoop数据存储处理的...

取消回复欢迎 发表评论: