Skip to content

Commit 720b5a1

Browse files
committed
函数字面量和_占位符
1 parent ea1961b commit 720b5a1

2 files changed

Lines changed: 56 additions & 1 deletion

File tree

src/cn/edu/jxnu/scala/basic/FunctionObjects.scala

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,4 +86,59 @@ object TestRantional extends App {
8686
implicit class implicitClass(val name: String) //隐式类必须用要有一个有一个参的主构造方法
8787

8888

89+
}
90+
91+
/**
92+
* 函数字面量与部分应用函数
93+
*/
94+
object Function extends App {
95+
96+
//函数字面量,一等函数
97+
val list = List(1, 2, 3, 4, 5, 6, 5)
98+
val f = (x: Int) => x > 5 // 函数是一个值
99+
val ret = list.filter(x => x > 5) //(x:Int) => x >5 缩写去掉类型。隐藏了目标的类型推断。整个filter接受一个函数字面量
100+
val ret2 = list.filter(f)
101+
for (r <- ret) {
102+
println(r)
103+
}
104+
for (r <- ret2) {
105+
println(r)
106+
}
107+
//以上效果一样
108+
//更新省略,精简的写法
109+
// _ 表示占位符
110+
val ret3 = list.filter(_ > 5)
111+
for (r <- ret3) {
112+
println(r)
113+
}
114+
// _>5写成独立的函数会编译不过,因为无法确定类型
115+
//必须指明类型,且括号不能省略
116+
val ff = (_: Int) > 5
117+
// 打印
118+
println(ff)
119+
//cn.edu.jxnu.scala.basic.Function$$$Lambda$18/4226387@18c7aca
120+
val ret4 = list.filter(ff)
121+
for (r <- ret4) {
122+
println(r)
123+
}
124+
125+
//当使用下划线时,实际是编写一个部分应用的函数,当传入任何需要的参数时,实际是将该函数应用到这些参数上
126+
//部分应用的函数是一个表达式,可给出部分或者不给出任何参数
127+
def sum(a: Int, b: Int) = a + b
128+
129+
//fun是一个函数值,它有sum函数的引用
130+
val fun = sum _
131+
val fun2 = sum(1, _: Int) //给出一个默认
132+
println(fun(2, 3)) //底层调用了 fun.apply(2,3) apply方法由编译器自动生成[实际是在混入了2个参数的Function2特质的函数类里面]
133+
// sum方法缺失2个参数,所以apply方法含有2个参数
134+
135+
}
136+
137+
/**
138+
* 其他函数特性
139+
*
140+
* 闭包
141+
*/
142+
object Function extends App {
143+
89144
}

src/cn/edu/jxnu/scala/basic/basicAndInfo.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ package object basic {
202202
* Scala的集合和映射(map) @see Test8.scala
203203
* Scala的可变集合主要用于命令式传统编程(当Java用),不可变主要用于函数式编程,推荐使用不可变,减少副作用,也更加安全 @see immutable.png、mutable.png
204204
* Scala从文件读取 @see IOExamples.scala、Test10.scala、Test11.scala
205-
* Scala 面向对象的类、单例对象、构造函数、序列化、注解、重写、重载等 @see ObjectsAndClasses.scala FunctionObjects.scala
205+
* Scala 面向对象的类、单例对象、构造函数、序列化、注解、重写、重载、函数字面量等 @see ObjectsAndClasses.scala FunctionObjects.scala Function.scala
206206
* Scala基础语法图解 @see Scala语法图解.png (已经取得作者本人同意)
207207
**/
208208

0 commit comments

Comments
 (0)