第三章 Lambda 表达式
2019独角兽企业重金招聘Python工程师标准>>>
一、Lambda管中窥豹
1、lambda没有名称,但它有参数列表,函数主体,返回类型,可能还有一个可以抛出的异常列表。
2、基本语法:
(parameters)->expression
或
(parameters)->{statements;}
二、在哪里以及如何使用Lambda
1、函数式接口
(1)函数式接口就是只定义一个抽象方法的接口(可以有多个默认方法)
(2)Lambda表达式允许你直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例(具体来说,是函数式接口一个具体实现的实例)
2、函数描述符
函数式接口的抽象方法的签名基本上就是Lambda表达式的签名。
三、把Lambda付诸实践:环绕执行模式
1、第1步,记得行为参数化
public static String processFileLimited() throws IOException {try (BufferedReader br =new BufferedReader(new FileReader("lambdasinaction/chap3/data.txt"))) {return br.readLine();}
}
2、第2步,使用函数式接口来传递行为
public interface BufferedReaderProcessor{public String process(BufferedReader b) throws IOException;}public static String processFile(BufferedReaderProcessor p) throws IOException {
}
3、第3步:执行一个行为
public static String processFile(BufferedReaderProcessor p) throws IOException {try(BufferedReader br = new BufferedReader(new FileReader("lambdasinaction/chap3/data.txt"))){return p.process(br);}}
4、第4步:传递Lambda
String oneLine = processFile((BufferedReader b) -> b.readLine());
System.out.println(oneLine);String twoLines = processFile((BufferedReader b) -> b.readLine() + b.readLine());
System.out.println(twoLines);
四、使用函数式接口
五、类型检查、类型推断以及限制
1、类型检查
类型检查过程可以分解为如下所示。
首先、你要找出filter方法的声明
第二、要求它是Predicate<Apple>(目标类型)对象的第二个正式参数。
第三、Predicate<Apple>是一个函数式接口,定义了一个叫作test的抽象方法。
第四、test方法描述了一个函数描述符,它可以接收一个Apple,并返回一个boolean
最后、filter的任何实际参数都必须匹配这个要求。
2、同样的Lambda,不同的函数式接口
Comparator<Apple> c1 =(Apple a1,Apple a2)->a1.getWeight().compareTo(a2.getWeight()):
ToIntBiFunction<Apple,Apple> c2 =(Apple a1, Apple a2)->a1.getWeight().compareTo(a2.getWeight()):
BiFunction<Apple,Apple,Integer> c3 =(Apple a1, Apple a2)->a1.getWeight().compareTo(a2.getWeight()):
3、类型推断
编译器可以了解Lambda表达式的参数类型,这样就可以在Lambda语法中省去标注参数类型。
4、使用局部变量
Lambda可以没有限制地捕获(也就是在其主体中引用)实例变量和静态变量。但局部变量必须显示声明final,或事实上是final。换句话说,Lambda表达式只能捕获指派给它们的局部变量。(注:捕获实例变量可以被看做捕获最终局部变量this)
六、方法引用
1、管中窥豹
使用方法引用时,目标引用放在分隔符::前,方法的名称放在后面。
2、构造函数引用
七、Lambda和方法引用实战
八、符合Lambda表达式的有用方法
1、比较器复合
(1)、逆序
(2)、比较器链
2、谓词复合
谓词接口包括三个方法:neget、and和or
3、函数复合
九、数学中的类似思想
1、积分
2、与java8的Lambda联系起来
转载于:https://my.oschina.net/u/2427561/blog/2235925
第三章 Lambda 表达式相关推荐
- C++Primer 第10章lambda表达式
C++Primer 第10章lambda表达式 泛型编程 咱们继续高歌猛进,下面我给大家继续讲关于算法的故事. 我们知道标准库容器中定义的算法大多数独立在算法之外,通常这些算法是通用的.它们可以处理不 ...
- 三:Lambda表达式
本章内容 Lambda管中窥豹 在哪里以及如何使用Lambda 环绕执行模式 函数式接口,类型推断 方法引用 Lambda复合 1. lambda管中窥豹 1.1 可以把Lambda表达式理解为简洁地 ...
- 《Java8实战》第3章 Lambda 表达式
利用行为参数化来传递代码有助于应对不断变化的需求.它允许你定义一段代码块来表示一个行为,然后传递它. 采用匿名类来表示多种行为并不令人满意:代码十分啰唆,这会影响程序员在实践中使用行为参数化的积极性. ...
- java lambda表达式_凯哥带你从零学大数据系列之Java篇---第二十二章:Lambda表达式...
温馨提示:如果想学扎实,一定要从头开始看凯哥的一系列文章(凯哥带你从零学大数据系列),千万不要从中间的某个部分开始看,知识前后是有很大关联,否则学习效果会打折扣. 系列文章第一篇是拥抱大数据:凯哥带你 ...
- [C# 3.0 入门] [第一章 Lambda表达式] 第三节:Lambda与匿名方法的区别(日文翻译)...
Lambda表达式与匿名方法的区别 那么,为什么Lambda表达式比匿名方法写起来要短呢?这种像变戏法一样的手法真的能用吗?有没有重要信息遗漏掉呢?为了回答这些问题,就让我们把匿名方法和Lambda表 ...
- Java8 Lambda表达式(三)Lambda表达式与Stream API
目录 1 Stream基本概念 1.1 什么是Stream 1.2 Stream的特点 2 Stream API初体验 2.1 构造数据 2.1 使用for循环实现 2.2 使用Lambda表达式结合 ...
- java day18【线程池、Lambda表达式】
第一章 等待唤醒机制 1.1 线程间通信 概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同. 比如:线程A用来生成包子的,线程B用来吃包子的,包子可以理解为同一资源,线程A与线程B ...
- Lambda表达式和Stream流
第一章.函数式编程思想和Lambda表达式定义格式 1.面向对象思想:重点是找对象,调用对象中的方法帮我们去做事儿,侧重点在找对象 2.函数式编程思想:对面向对象思想进一步简化,不注重过程,只注重结果 ...
- day07【线程池、Lambda表达式】(1)
day07[线程池.Lambda表达式] 主要内容 等待与唤醒案例 线程池 Lambda表达式 教学目标 -[ ] 能够理解线程通信概念 -[ ] 能够理解等待唤醒机制 -[ ] 能够描述Java中线 ...
最新文章
- Siege的线程模型-基于版本2.56
- html3D效果可以在手机打开吗,手机怎么打开HTML
- JavaScript中数组slice和splice的对比小结
- Linux下MySQL 5.5.11编译安装笔记(待验证)
- leetcode-125 Valid Palindrome
- 【Liteos系列】之osCmdReg
- Dart 基礎 - 3
- Geohot使用绿雨的BETA4越狱iPhone4 4.1固件详细教程
- ➤mobi➢azw3➢epub⇨电子书阅读器 转换器
- python怎么做成app_自己怎么做App软件 自己制作APP教程
- android 饿了么 布局,Android仿饿了么详情页可以跟随手指移动 viewpager变详情页
- Excel 如何引用某表格中的某一列作为数据有效性验证
- 超图申请试用以及激活
- linux 获取视频截图,linux ffmpeg 视频截图 安装使用
- 图机器学习——5.9 图神经网络:图的增广
- mysql 1146 错误处理
- slick.js应用
- Monkey测试问题及解决方法
- runspec 的选项说明(spec2006官方文档的翻译)
- 四则运算游戏 java代码_四则运算程序(java基于控制台)
热门文章
- python换零钱有多少种方案_Python之100个项目:零钱转换程序
- 第 2 章 索引优化分析
- linux pv命令,pv命令_Linux pv命令使用详解:用来度量执行命令的具体信息
- Elasticsearch基础(一)mapping
- qt获取当前正在编辑的文件名和路径_node学习——path 路径模块
- flutter图片聊天泡泡_flutter即时聊天IM仿微信|flutter聊天界面
- sql 在某表中加入一列count所有数据_执行COUNT(1)、COUNT(*) 与 COUNT(列名) 到底有什么区别?...
- vacode允许c_使用VS code编译运行C,C++,Java程序
- CommonJS模块的循环加载
- js正则匹配小数点后2位_正则实践与详解