001 lambda的分析
一 . lambda的使用条件 ---- 函数式接口
如果一个接口之中仅仅只有一个抽象的方法,那么我们就称这种接口为函数式接口.
首先我们看看JDK之中的函数式的接口.
@FunctionalInterface public interface Runnable { public abstract void run(); }
上面的接口就是我们最常用的Runnable接口,在JDK8之后,我们发现在该接口之中增加了一个@FunctionalInterface注解,用来表示这个接口是一个函数式的接口.
那么,函数式接口的注解和函数式接口有什么关系呢?其实这个注解是用来约束在编译期发现该接口的定义是否正确的接口,我们判断一个接口是否是函数接口的条件
永远都是是否仅仅只有一个抽象的方法.
二 . 匿名内部类
在JDK8之前,我们怎么常常在代码使用匿名内部类来完成一个对象的一次性的创建.
如下:
new Thread(new Runnable() {@Overridepublic void run() {for(;;)System.out.println("Thread is running...");}}).start();
我们使用匿名内部类实际上创建了一个接口的实例,但是上面的代码之中存在很多的模板代码,因此在jdk8之中出现了lambda表达式帮助我们实现上述代码的简化.
如下:
new Thread(()-> {for(;;)System.out.println("Thread is running...");}).start();
我们发现上述的代码比之前的匿名内部类的方式代码简化了很多.
三.匿名内部类是否已经死亡?
在使用lambda表达式之前,我们首先需要知道lambda表达式的本质到底是什么?
看下面的代码:
Runnable able = ()->{System.out.println("Thread is running...");};
我们能够看到lambda表达式本质上就是一个接口的实例对象,只是从语法的角度上进行了简化而已.
说到接口,我们上面提到了函数式接口(仅仅只含有一个抽象方法的接口),没错,lambda表达式仅仅只能替换此类接口的实例.
说到现在,我们已经知道下面的事实:
[1]lambda表达式本身就是一个接口的实例对象而已.
[2]lambda表达式仅仅只能适用在函数式接口之中.
匿名内部类依然存在,只是一部分功能交给lambda表达式更加合适而已.
四 .行为函数
方法,我们在其他的语言之中常常称为函数,本质上函数就是将一组参数进行处理,然后返回一个值的一段代码而已.
我们可以这样的描述函数(方法): [入参] ---------------> [返回值].
我们从这个角度上看,函数除了实现的逻辑不通之外,对外暴露出来的最大的不同就是参数和返回值.
因此,我们可以将参数和返回作为函数分类的一种标准.
函数执行的逻辑我们称为一种行为.
我们看下面的一个例子:
/*** 我们定义了一个接口* @author JieYun**/static interface TestExec{void exec();}//本类之中的核心方法public static void exec(TestExec demo) {demo.exec();}public static void main(String[] args) {exec(new TestExec() {@Overridepublic void exec() {System.out.println("first demo");}});exec(new TestExec() {@Overridepublic void exec() {System.out.println("second demo");}});}
在上面的例子之中,我们传递的不同的实例,然后产生的不同行为,我们看看我们传递的参数到底是什么? 没错,就是一个内名内部类的对象,在这里实际也是一个lambda表达式了.
现在,我们就可以了解到lambda表达式就是一个行为参数.
转载于:https://www.cnblogs.com/trekxu/p/9396174.html
001 lambda的分析相关推荐
- Scala - Spark Lambda“goesto“ = 分析
1 /// 定义一个函数AddNoise,参数分别为rdd,Fraction.其中rdd为(BreezeDenseMatrix, BreezeDenseMatrix)元组构成的RDD.Fraction ...
- NC:自体免疫水泡皮肤病中鉴定基因与微生物组互作(微生物组关联分析MWAS)
之前我们平台分享过<Nature:宏基因组关联分析>综述,让大家系统的了解这一领域.同时还分享过一篇 <GigaScience:谷子产量与微生物组关联分析>是植物领域中的优秀工 ...
- Linq、Lambda表达式详细总结(转)
(一)输入参数 在Lambda表达式中,输入参数是Lambda运算符的 左边部分.它包含参数的数量可以为0.1或者多个.只有当输入参数为1时,Lambda表达式左边的一对小括弧才可以省略.输入参数的数 ...
- 用lambda构建ORM查询语句
本文介绍如何解析lambda表达式来获取一个满足条件的查询语句. 先看个截图 通过设置实体对象Article_Content的查询表达式,就可以获取对应的参数化SQL语句,使用起来很方便,减少了代码 ...
- x264 编码器选项分析 (x264 Codec Strong and Weak Points) 2
文章目录: x264 编码器选项分析 (x264 Codec Strong and Weak Points) 1 x264 编码器选项分析 (x264 Codec Strong and Weak Po ...
- ctf流量分析练习二
上次的流量分析做的我一个脑袋两个大!但是不能放弃啊,再找一些题来练练手 0x01 经典题型 CTF题型主要分为流量包修复.WEB流量包分析.USB流量包分析和其他流量包分析. 01 流量包修复 比赛过 ...
- Lambda表达式详细总结
(一)输入参数 在Lambda表达式中,输入参数是Lambda运算符的左边部分.它包含参数的数量可以为0.1或者多个.只有当输入参数为1时,Lambda表达式左边的一对小括弧才可以省略.输入参数的数量 ...
- 02java进阶03-异常、线程、同步、线程池、Lambda表达式、File类、递归
目录 一.异常 二.异常的处理 三.自定义异常 四.多线程 五.线程.同步 5.1.线程 5.2同步 5.3线程安全 5.4线程状态 六.等待唤醒机制 6.1 线程间通信 6.2 等待唤醒机制 6.3 ...
- Lambda表达式(Java)
我们都知道Java 8 支持Lambda表达式,但是平时开发中也很难用到这个东东,但是作为专业的程序员,技多不压身(其实我是在学Kotlin中,发现里面大量的运用到了Lambda表达式,看的我一脸懵逼 ...
- ucinet常用分析路径
1.将多值关系数据转换成二值关系数据,路径:变换→对分 2.密度分析,路径:网络→凝聚力→密度→密度 3.利用Net-Draw程序生成可视化结构图, 路径:可视化→Net-Draw→Open→ ...
最新文章
- 不要假装很努力,因为结果不会陪你演戏
- 计算机林中鸟歌曲,励志歌曲曲-林中鸟
- php 给图片增加背景平铺水印代码
- vSphere虚拟化之ESXi安装及部署
- wcf ria中主从表绑定treeview
- 数字签名、数字证书、对称加密算法、非对称加密算法、单向加密(散列算法)
- Linux学习之系统编程篇:利用 setitimer 实现 alarm练习
- 【详细讲解】某书店有一个收银员该书店最多允许n个购书者进入。将收银员和购书者看作不同的进程,其工作流程如下图所示。利用PV操作实现该过程,设置信号量S1,S2和Sn,初值分别为0,0,n.则图中a1
- Asp.net 关于错误提示 类型“XXX1”在未被引用的程序集中定义,必须添加对程序集XXX2的引用...
- 拆分:分解单块系统——《微服务设计》读书笔记
- 抽象工厂设计模式示例
- 安卓应用安全指南 4.8 输出到 LogCat
- golang nats request/reply模式
- 【网络编程】Socket网络编程基础
- 基于WebUploader、SpringMVC的断点续传
- 全球市场喷干水果粉市场销售规模及投资盈利预测报告(新版)2022年
- 区分度评估指标-KS
- 快应用联盟展示入口合集(11月更新)
- IT痴汉的工作现状14-段子
- Android 百度地图获取定位信息并实时传给后台