-
Notifications
You must be signed in to change notification settings - Fork 27
/
Copy path20181119-D-java-10.html
176 lines (163 loc) · 9.46 KB
/
20181119-D-java-10.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>葡萄藤PPT</title>
<link rel="stylesheet" href="https://ptteng.github.io/PPT/css/reveal/reveal.css">
<!-- PPT主题,可以在/css/reveal/theme/中选择其他主题,目前暂时只能使用该模板 -->
<link rel="stylesheet" href="https://ptteng.github.io/PPT/css/reveal/theme/ptt.css">
<!-- syntax highlighting 代码高亮主题 -->
<link rel="stylesheet" href="https://ptteng.github.io/PPT/lib/reveal/css/zenburn.css">
<!-- 打印和PDF输出样式 -->
<script>
var link = document.createElement( 'link' );
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = window.location.search.match( /print-pdf/gi ) ? 'https://ptteng.github.io/PPT/css/reveal/print/pdf.css' : '../css/reveal/print/paper.css';
document.getElementsByTagName( 'head' )[0].appendChild( link );
</script>
</head>
<body>
<img src="https://ptteng.github.io/PPT/img/demo/logo.png" alt="" usemap="#pttmap" class="base-logo">
<map name="pttmap">
<area shape="rect" coords="0,0,276,58" href="http://www.jnshu.com" alt="" target="_blank"/>
</map>
<div class="reveal">
<div class="slides">
<section>
<h2>Lambda表达式</h2>
<p>分享人:何爽</p>
</section>
<section>
<p>1.背景介绍</p>
<p>2.知识剖析</p>
<p>3.常见问题</p>
<p>4.编码实战</p>
<p>5.扩展思考</p>
<p>6.参考文献</p>
<p>7.更多讨论</p>
</section>
<section>
<h3>1.背景介绍</h3>
<p>一、简介</p>
<p>(注:虽然看着很先进,其实Lambda表达式的本质只是一个"语法糖",由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能。
建议不要乱用,因为这就和某些很高级的黑客写的代码一样,简洁,难懂,难以调试,维护人员想骂娘.)</p>
<p>Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。</p>
</section>
<section>
<p>Lambda表达式还增强了集合库。 Java SE 8添加了2个对集合数据进行批量操作的包: java.util.function 包以及java.util.stream 包。 流(stream)就如同迭代器(iterator),但附加了许多额外的功能。
总的来说,lambda表达式和 stream 是自Java语言添加泛型(Generics)和注解(annotation)以来最大的变化。</p>
<p>Lambda其实就是匿名方法;Java会在背后,悄悄的,把这些都还原成匿名类方式。匿名类--指的是在声明一个类的同时实例化它,使代码更加简洁精练</p>
</section>
<section>
<p>匿名类?</p>
<p>匿名类指的是在声明一个类的同时实例化它,使代码更加简洁精练通常情况下,要使用一个接口或者抽象类,都必须创建一个子类有的时候,为了快速使用,直接实例化一个抽象类,
并“当场”实现其抽象方法。既然实现了抽象方法,那么就是一个新的类,只是这个类,没有命名。这样的类,叫做匿名类</p>
</section>
<section>
<h3>2.知识剖析</h3>
<p>lambda运算符:</p>
<p>所有的lambda表达式都是用新的lambda运算符 " -> ",可以叫他,“转到”或者 “成为”。</p>
<p>运算符将表达式分为两部分,左边指定输入参数,中间是箭头,右边是lambda的主体。</p>
<p>(参数类型 参数名)->{代码主体}</p>
<p>1.标准写法:(类型1 参数名1,类型2 参数名2...)->{代码块}</p>
<p>2.参数类型可以推断 :(参数名1,参数名2...)->{代码块}</p>
<p>3.存在多行代码 :(参数名1,参数名2...)->{代码行;--代码行}</p>
</section>
<section>
<p>4.单个参数并可推断类型 :(参数名1)->{代码块}</p>
<p>5.方法引用 :System.out::println</p>
<p>6,没有参数 :()->{代码块}</p>
<p>lambda表达式与匿名内部类:</p>
<p>匿名内部类也就是没有名字的内部类
正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写
但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口
PS:Lambda表达式并不能取代所有的匿名内部类,只能用来取代函数接口(Functional Interface)的简写。</p>
<p></p>
<p></p>
<p></p>
</section>
<section>
<p>lambda表达式与函数式接口:</p>
<p>函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。</p>
<p>任何接口,如果只包含唯一 一个抽象方法,那么它就是一个Functional Interface。
之前它们被称为 SAM类型,即 单抽象方法类型(Single Abstract Method)。</p>
<p>接口中的方法默认就是public abstract的。</p>
<p>函数式接口需要添加:@FunctionalInterface</p>
<p></p>
</section>
<section>
<h3>3.常见问题 </h3>
<p>如果lambda只能使用一次,那么它的优势又有什么呢?</p>
<p>一.lamada表达式简化了接口实现的过程,使得代码结构更加简洁。</p>
<p>二.lamada的使用非常灵活。</p>
<p>我们为什么需要Lambda表达式呢?</p>
<p>lambda表达式通过实现匿名类的方式对接口或者类进行了实例化,但是因为实例化的对象没有名字,也就无法进行二次使用,所以lambda表达式只能够使用一次,也就只能够使用或者执行一个方法。</p>
</section>
<section>
<p>简单讲就是:用lambda表达式构造方法实体,等价于实现了接口中的方法,最终lambda表达式的返回值就是接口的实现类。</p>
</section>
<section>
<h3>4.编码实战</h3>
<p></p>
</section>
<section>
<h3>5.扩展思考</h3>
<p>lambda的优点?</p>
<p>与匿名类 概念相比较,Lambda其实就是匿名方法,这是一种把方法作为参数进行传递的编程思想。代码很简洁。</p>
<p>lambda有缺点吗?</p>
<p>1. 可读性差,与啰嗦的但是清晰的匿名类代码结构比较起来,Lambda表达式一旦变得比较长,就难以理解。</p>
<p>2. 不便于调试,很难在Lambda表达式中增加调试信息,比如日志。</p>
<p>3. 版本支持,Lambda表达式在JDK8版本中才开始支持,如果系统使用的是以前的版本,考虑系统的稳定性等原因,而不愿意升级,那么就无法使用。</p>
<p></p>
</section>
<section>
<h3>6.参考文献</h3>
<p>https://www.jianshu.com/p/4e858f2084b8</p>
<p>https://blog.csdn.net/KOKjock/article/details/80114900</p>
<p>https://www.cnblogs.com/franson-2016/p/5593080.html</p>
</section>
<section>
<h3>7.更多讨论</h3>
</section>
<section>
<h4>分享到此结束</h4>
<p>谢谢大家!</p>
</section>
</div>
</div>
<script src="https://ptteng.github.io/PPT/lib/reveal/js/head.min.js"></script>
<script src="https://ptteng.github.io/PPT/lib/reveal/reveal.js"></script>
<script>
// 以下为常见配置属性的默认值
// {
// controls: true, // 是否在右下角展示控制条
// progress: true, // 是否显示演示的进度条
// slideNumber: false, // 是否显示当前幻灯片的页数编号,也可以使用代码slideNumber: 'c / t' ,表示当前页/总页数。
// history: false, // 是否将每个幻灯片改变加入到浏览器的历史记录中去
// keyboard: true, // 是否启用键盘快捷键来导航
// overview: true, // 是否启用幻灯片的概览模式,可使用"Esc"或"o"键来切换概览模式
// center: true, // 是否将幻灯片垂直居中
// touch: true, // 是否在触屏设备上启用触摸滑动切换
// loop: false, // 是否循环演示
// rtl: false, // 是否将演示的方向变成RTL,即从右往左
// fragments: true, // 全局开启和关闭碎片。
// autoSlide: 0, // 两个幻灯片之间自动切换的时间间隔(毫秒),当设置成 0 的时候则禁止自动切换,该值可以被幻灯片上的 ` data-autoslide` 属性覆盖
// transition: 'default', // 切换过渡效果,有none/fade/slide/convex/concave/zoom
// transitionSpeed: 'default', // 过渡速度,default/fast/slow
// mouseWheel: true, //是否启用通过鼠标滚轮来切换幻灯片
// }
// 初始化幻灯片
Reveal.initialize({
history: true,
dependencies: [
{ src: 'https://ptteng.github.io/PPT/plugin/markdown/marked.js' },
{ src: 'https://ptteng.github.io/PPT/plugin/markdown/markdown.js' },
{ src: 'https://ptteng.github.io/PPT/plugin/notes/notes.js', async: true },
{ src: 'https://ptteng.github.io/PPT/plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } }
]
});
</script>
</body>
</html>