lambda表达式的究极理解
介绍
Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
使用 Lambda 表达式可以使代码变的更加简洁紧凑。
重点
1. 函数接口FunctionInterFace
函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
函数式接口可以被隐式转换为 lambda 表达式。
Lambda 表达式和方法引用(实际上也可认为是Lambda表达式)上。
lambda表达式,是指在方法中实现函数接口,或说将函数接口中的方法实现,这样看来,函数的实现就像是方法的一个参数。
也就是把函数作为方法的参数。你无需纠结lambda表达式中参数列表中值的来源,因为他只是方法/函数的实现,而不是方法/函数的调用!我们不需要细究调用这个函数时,参数的来源。
我们现在把lambda表达式实现的函数接口的方法叫函数,把能使用lambda的方法就叫方法。
Eg:
var Timer=new Timer(1000,event->System.out.println("The time is "+new Date())
);
我们来看Timer的此构造器
public Timer(int delay, ActionListener listener) {super();this.delay = delay;this.initialDelay = delay;doPostEvent = new DoPostEvent();if (listener != null) {addActionListener(listener);}
}
我们将参数一一对应。
Lambda表达式对应的是ActionListener listener。这是一个只有一个抽象方法的接口。
public interface ActionListener extends EventListener {/*** Invoked when an action occurs.* @param e the event to be processed*/public void actionPerformed(ActionEvent e);}
我们回顾下lambda表达式
event->System.out.println("The time is "+new Date()
这是简化后的表达式,简化前应该是
(AcTionEvent event)->{System.out.println("The time is "+new Date()}
所以lambda表达式中的参数列表的event就是函数的参数列表中的ActionEvent e
函数: public void actionPerformed(ActionEvent e);
2. 理解
那么只看lambda表达式,会思考这个参数哪里来,或说值是什么?
总结一下,能使用lambda的方法,会提供一个接口“对应”表达式,然后表达式会实现接口里的方法/函数,由于是函数接口,方法只有一个,所以lambda的函数实现也只有一个(肯定不能一次两个)。那么我们在使用这个方法,例如构造器,这个接口参数,我们肯定要放入一个实现类或匿名类或null啊,总之要实现这个接口参数。
假如不用lambda表示式,我们如何实现这个接口参数。
匿名类
var Timer=new Timer(1000,new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("The time is "+new Date()) }
}}
);
或者我们创建一个类叫TimerEvent实现ActionListener接口以及里面的actionPerformed方法
就变成了
var Timer=new Timer(1000,new TimerEvent());
而函数就在TimerEvent里实现了。
那我们有没有更简单的方式来为Timer的构造方法里的ActionListener参数提供实例呢?
那就是lambda表示,它直接实现了函数接口的函数,当然你实现了接口方法就代表你得实例化这个接口,你实现了接口你就得实现接口方法。而我没必要为一个函数单独分类(就像TimerEvent),所以lambda直接就实现函数---->方法都实现了,那肯定有了接口的实现类,但你不能显式(new XXX)看见罢了。
3. 总结
Lambd表达式是对方法中函数参数(函数接口)的函数实现。从而方法可以调用该函数(通过lambda实现了的接口)
所以要用lambda,该方法得有一个参数代表函数也就是函数接口,当我们要使用这个方法时候,这个接口参数肯定要实例化(毕竟java面向对象)。而lambda实现了函数接口中的函数,从而实例化了接口,然后这个函数作为方法参数任方法调用函数。
Lambda本质就是接口实现,不过是在方法中对方法的接口参数进行实现。再细致点就是对方法接口参数的实现,针对性强点就是实现函数作为方法参数。
随用随实现,我甚至可以多次调用同一方法,并使用不同的lambda表达式对方法的同一接口参数进行不同实现,而我没必要生产多个不同实现类来new注入到方法,也懒得多次在方法中生产匿名类(这和生产实现类差不多的代码量)。而我们只需要
(Parameter1,Parameter2)->{~~~~~~}
(接口中方法的参数列表)->{
方法体
}
来实现方法要调用的函数。
lambda表达式的究极理解相关推荐
- python lambda表达式及用法_Python:lambda表达式和yield关键字理解与使用讲解
一.lambda表达式 1.1.lambda表达式理解 lambda的主体是一个表达式,而不是一个代码块,仅仅能在lambda表达式中封装有限的逻辑进去.如果要通俗的理解lambda表达式,可以结合C ...
- lambda表达式学习(详细理解 ) 重点在最后
多线程的runable接口,如果你的代码简单就可以用lambda简化 package cn.com.zzn.lambda;public class TestLambda2 {// 静态内部类/* st ...
- [C# 基础知识系列]专题十四:深入理解Lambda表达式
引言: 对于刚刚接触Lambda表达式的朋友们,可能会对Lambda表达式感到非常疑惑,它到底是个什么什么样的技术呢?以及它有什么好处和先进的地方呢?下面的介绍将会解除你这些疑惑. 一.Lambda表 ...
- Java中的lambda表达式如何理解——精简
✌️✌️✌️在写之前,我在考虑是否要写这篇文章,然而当我查阅"lambda表达式"的相关内容的时候,我发现大量的文章都出现了冗余的现象,文章的篇幅过于夸张,严重影响了大家阅读的兴趣 ...
- C# Lambda表达式
"Lambda表达式"是一个匿名函数,是一种高效的类似于函数式编程的表达式,Lambda简化了开发中需要编写的代码量.它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型, ...
- Lambda 表达式的应用
lambda表达式 函数式接口:只有一个方法的接口,比如Runnable和Comparator 先看几个 lambda 表达式的例子进行理解 (int x,int y) -> x + y //接 ...
- C++ Lambda 表达式
实际工作中,常常看到的c++ Lambda表达式,如何快速理解呢. 1.Lambada 表达式的来源 来自于函数式编程的概念,有什么优点? (1)匿名的定义写一个函数,不用再复用函数,也可以让代码更简 ...
- 匿名函数,Lambda表达式,委托
C# 委托(Delegate) C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针.委托(Delegate) 是存有对某个方法的引用的一种引用类型变量.引用可在运行时被改变.委托( ...
- C ++匿名函数:揭开C++ Lambda表达式的神秘面纱
潜意识编程:揭秘C++ Lambda表达式的神秘面纱 Subconscious Programming: Unveiling the Mystery of C++ Lambda Expressions ...
最新文章
- 如何给机房的服务器安装系统,云机房服务器系统安装
- (深入理解)matplotlib的交互模式(block,interactive,ion,ioff,draw,show,plot等的区别)
- python画树叶-使用Python turtle画分形树叶图
- PhpStorm 注册相关
- 不会Python开发的运维终将被淘汰?
- python函数库_10. 标准库简介
- 参考文献格式字号字体_干货分享|同学,你的论文格式有点不太对啊!
- oracle存档模式,Oracle学习系列之如何开启归档模式
- XXL-API v1.1.1 发布,API管理平台
- html登录页面代码Java,html简单登录页面代码
- 史上最完整的APP商城源码(含服务器)
- css如何设置动画,css3如何设置动画?css设置简单动画的方法
- 软件单元测试及测试用例设计
- 高级语言程序设计(c语言版)课后答案,高级语言程序设计习题与解答(C语言版)/高等院校教材...
- 京瓷打印机m5521cdn_京瓷Kyocera ECOSYS M5521cdn 驱动
- Visual Studio调用约定 __cdecl、__stdcall和__fastcall
- mui 屏蔽手机物理返回按键(安卓+苹果)
- 2020你还在烦恼网络硬盘选择吗?分享50个免费的云盘网盘服务——拥有无限储存空间
- 将自己训练的MASK-RCNN模型用于摄像头实时检测
- 怎么安装linux操作系统
热门文章
- at定时任务:Can't open /var/run/atd.pid to signal atd. No atd running?
- 周二,晴,风大,寒冷
- windows 设置mvn 本地命令
- mysql 操作封装
- HTML5教程实例-用Canvas制作径向渐变图形
- 6中结构型设计模式的对比理解(Composite组合模式,Proxy代理模式,Flyweight享元模式,Facade门面模式,Bridge桥接模式,Decorator装饰器模式)
- 系统调用原理与用户态以及内核态相互切换过程,以linux系统为主
- plot绘图只能在工具栏的预览显示,无法全屏弹窗显示---matlab 不学无术小问题
- 一个IT男的迷茫独白
- 基于MPLS ×××城域网的设计(下篇