介绍

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表达式的究极理解相关推荐

  1. python lambda表达式及用法_Python:lambda表达式和yield关键字理解与使用讲解

    一.lambda表达式 1.1.lambda表达式理解 lambda的主体是一个表达式,而不是一个代码块,仅仅能在lambda表达式中封装有限的逻辑进去.如果要通俗的理解lambda表达式,可以结合C ...

  2. lambda表达式学习(详细理解 ) 重点在最后

    多线程的runable接口,如果你的代码简单就可以用lambda简化 package cn.com.zzn.lambda;public class TestLambda2 {// 静态内部类/* st ...

  3. [C# 基础知识系列]专题十四:深入理解Lambda表达式

    引言: 对于刚刚接触Lambda表达式的朋友们,可能会对Lambda表达式感到非常疑惑,它到底是个什么什么样的技术呢?以及它有什么好处和先进的地方呢?下面的介绍将会解除你这些疑惑. 一.Lambda表 ...

  4. Java中的lambda表达式如何理解——精简

    ✌️✌️✌️在写之前,我在考虑是否要写这篇文章,然而当我查阅"lambda表达式"的相关内容的时候,我发现大量的文章都出现了冗余的现象,文章的篇幅过于夸张,严重影响了大家阅读的兴趣 ...

  5. C# Lambda表达式

    "Lambda表达式"是一个匿名函数,是一种高效的类似于函数式编程的表达式,Lambda简化了开发中需要编写的代码量.它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型, ...

  6. Lambda 表达式的应用

    lambda表达式 函数式接口:只有一个方法的接口,比如Runnable和Comparator 先看几个 lambda 表达式的例子进行理解 (int x,int y) -> x + y //接 ...

  7. C++ Lambda 表达式

    实际工作中,常常看到的c++ Lambda表达式,如何快速理解呢. 1.Lambada 表达式的来源 来自于函数式编程的概念,有什么优点? (1)匿名的定义写一个函数,不用再复用函数,也可以让代码更简 ...

  8. 匿名函数,Lambda表达式,委托

    C# 委托(Delegate) C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针.委托(Delegate) 是存有对某个方法的引用的一种引用类型变量.引用可在运行时被改变.委托( ...

  9. C ++匿名函数:揭开C++ Lambda表达式的神秘面纱

    潜意识编程:揭秘C++ Lambda表达式的神秘面纱 Subconscious Programming: Unveiling the Mystery of C++ Lambda Expressions ...

最新文章

  1. 如何给机房的服务器安装系统,云机房服务器系统安装
  2. (深入理解)matplotlib的交互模式(block,interactive,ion,ioff,draw,show,plot等的区别)
  3. python画树叶-使用Python turtle画分形树叶图
  4. PhpStorm 注册相关
  5. 不会Python开发的运维终将被淘汰?
  6. python函数库_10. 标准库简介
  7. 参考文献格式字号字体_干货分享|同学,你的论文格式有点不太对啊!
  8. oracle存档模式,Oracle学习系列之如何开启归档模式
  9. XXL-API v1.1.1 发布,API管理平台
  10. html登录页面代码Java,html简单登录页面代码
  11. 史上最完整的APP商城源码(含服务器)
  12. css如何设置动画,css3如何设置动画?css设置简单动画的方法
  13. 软件单元测试及测试用例设计
  14. 高级语言程序设计(c语言版)课后答案,高级语言程序设计习题与解答(C语言版)/高等院校教材...
  15. 京瓷打印机m5521cdn_京瓷Kyocera ECOSYS M5521cdn 驱动
  16. Visual Studio调用约定 __cdecl、__stdcall和__fastcall
  17. mui 屏蔽手机物理返回按键(安卓+苹果)
  18. 2020你还在烦恼网络硬盘选择吗?分享50个免费的云盘网盘服务——拥有无限储存空间
  19. 将自己训练的MASK-RCNN模型用于摄像头实时检测
  20. 怎么安装linux操作系统

热门文章

  1. at定时任务:Can't open /var/run/atd.pid to signal atd. No atd running?
  2. 周二,晴,风大,寒冷
  3. windows 设置mvn 本地命令
  4. mysql 操作封装
  5. HTML5教程实例-用Canvas制作径向渐变图形
  6. 6中结构型设计模式的对比理解(Composite组合模式,Proxy代理模式,Flyweight享元模式,Facade门面模式,Bridge桥接模式,Decorator装饰器模式)
  7. 系统调用原理与用户态以及内核态相互切换过程,以linux系统为主
  8. plot绘图只能在工具栏的预览显示,无法全屏弹窗显示---matlab 不学无术小问题
  9. 一个IT男的迷茫独白
  10. 基于MPLS ×××城域网的设计(下篇