feat:ChatGPT第 5 课:函数作为参数
This commit is contained in:
@@ -0,0 +1,21 @@
|
|||||||
|
package practise5.demo
|
||||||
|
/*
|
||||||
|
doSomething
|
||||||
|
↓
|
||||||
|
需要一个函数
|
||||||
|
↓
|
||||||
|
x => x * 2
|
||||||
|
↓
|
||||||
|
把这个函数交给 doSomething
|
||||||
|
|
||||||
|
这就是:
|
||||||
|
函数作为参数传递。
|
||||||
|
*/
|
||||||
|
object Demo {
|
||||||
|
def main(args: Array[String]): Unit = {
|
||||||
|
doSomething(x => x * 2)
|
||||||
|
}
|
||||||
|
private def doSomething(f: Int => Int): Unit = {
|
||||||
|
println(f(10))
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
package practise5.exercises
|
||||||
|
|
||||||
|
/*
|
||||||
|
练习 1
|
||||||
|
|
||||||
|
定义:
|
||||||
|
def operate(a: Int, b: Int, f: (Int, Int) => Int): Int = {
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
|
||||||
|
要求让它能够这样使用:
|
||||||
|
println(operate(10, 20, (a, b) => a + b))
|
||||||
|
|
||||||
|
输出:
|
||||||
|
30
|
||||||
|
|
||||||
|
提示:
|
||||||
|
函数参数 f 可以这样调用:
|
||||||
|
|
||||||
|
f(a, b)*/
|
||||||
|
object Exercises1 {
|
||||||
|
def main(args: Array[String]): Unit = {
|
||||||
|
println(operate(10, 20, (a, b) => a + b))
|
||||||
|
}
|
||||||
|
|
||||||
|
def operate(a: Int, b: Int, f: (Int, Int) => Int): Int = {
|
||||||
|
f(a, b)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
package practise5.exercises
|
||||||
|
|
||||||
|
/*
|
||||||
|
让下面这些都能正常工作:
|
||||||
|
println(operate(10, 20, (a, b) => a + b))
|
||||||
|
println(operate(10, 20, (a, b) => a - b))
|
||||||
|
println(operate(10, 20, (a, b) => a * b))
|
||||||
|
|
||||||
|
输出:
|
||||||
|
30
|
||||||
|
-10
|
||||||
|
200
|
||||||
|
|
||||||
|
注意:
|
||||||
|
operate 自己并不知道你要做加法、减法还是乘法。
|
||||||
|
|
||||||
|
它只负责:
|
||||||
|
接收两个数字
|
||||||
|
+
|
||||||
|
接收一个函数
|
||||||
|
+
|
||||||
|
执行这个函数
|
||||||
|
*/
|
||||||
|
object Exercises2 {
|
||||||
|
def main(args: Array[String]): Unit = {
|
||||||
|
println(operate(10, 20, (a, b) => a + b))
|
||||||
|
println(operate(10, 20, (a, b) => a - b))
|
||||||
|
println(operate(10, 20, (a, b) => a * b))
|
||||||
|
}
|
||||||
|
|
||||||
|
def operate(a: Int, b: Int, f1: (Int, Int) => Int): Int = {
|
||||||
|
f1(a, b)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
package practise5.exercises
|
||||||
|
|
||||||
|
/*
|
||||||
|
练习 3
|
||||||
|
|
||||||
|
自己定义:
|
||||||
|
def calculate(a: Int, f: Int => Int): Int
|
||||||
|
|
||||||
|
要求:
|
||||||
|
println(calculate(10, x => x * 2))
|
||||||
|
|
||||||
|
输出:
|
||||||
|
20
|
||||||
|
|
||||||
|
以及:
|
||||||
|
println(calculate(10, x => x * 3))
|
||||||
|
|
||||||
|
输出:
|
||||||
|
30
|
||||||
|
*/
|
||||||
|
object Exercises3 {
|
||||||
|
def main(args: Array[String]): Unit = {
|
||||||
|
println(calculate(10, x => x * 2))
|
||||||
|
println(calculate(10, x => x * 3))
|
||||||
|
}
|
||||||
|
private def calculate(a: Int, f: Int => Int): Int = {
|
||||||
|
f(a)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
package practise5.exercises
|
||||||
|
|
||||||
|
/*
|
||||||
|
练习 4
|
||||||
|
|
||||||
|
给:
|
||||||
|
val nums = List(1, 2, 3, 4, 5)
|
||||||
|
|
||||||
|
先自己定义一个函数:
|
||||||
|
val double = (x: Int) => x * 2
|
||||||
|
|
||||||
|
然后不要直接写:
|
||||||
|
nums.map(x => x * 2)
|
||||||
|
|
||||||
|
而是:
|
||||||
|
nums.map(double)
|
||||||
|
|
||||||
|
观察结果。
|
||||||
|
|
||||||
|
也就是说:
|
||||||
|
x => x * 2
|
||||||
|
|
||||||
|
和:
|
||||||
|
double
|
||||||
|
|
||||||
|
都可以作为 map 的参数。
|
||||||
|
*/
|
||||||
|
object Exercises4 {
|
||||||
|
def main(args: Array[String]): Unit = {
|
||||||
|
val nums = List(1, 2, 3, 4, 5)
|
||||||
|
val double = (x: Int) => x * 2
|
||||||
|
println(nums.map(double))
|
||||||
|
println(nums.map(x => x * 2))
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
package practise5.exercises
|
||||||
|
|
||||||
|
/*
|
||||||
|
练习 5 ⭐⭐⭐
|
||||||
|
|
||||||
|
最后做一道非常接近真实 Scala/Spark 的:
|
||||||
|
val nums = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
|
||||||
|
|
||||||
|
完成:
|
||||||
|
1. 过滤出偶数
|
||||||
|
2. 每个偶数乘 10
|
||||||
|
3. 最终得到 List(20, 40, 60, 80, 100)
|
||||||
|
|
||||||
|
要求使用:
|
||||||
|
filter
|
||||||
|
map
|
||||||
|
|
||||||
|
并且尽量使用函数值变量,例如:
|
||||||
|
val isEven = ...
|
||||||
|
val multiply10 = ...
|
||||||
|
|
||||||
|
最终类似:
|
||||||
|
nums
|
||||||
|
.filter(isEven)
|
||||||
|
.map(multiply10)
|
||||||
|
*/
|
||||||
|
|
||||||
|
object Exercises5 {
|
||||||
|
def main(args: Array[String]): Unit = {
|
||||||
|
val nums = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
|
||||||
|
val isEven = (x:Int) => x%2==0
|
||||||
|
val multiply10 = (x:Int) => x * 10
|
||||||
|
val result = nums.filter(isEven).map(multiply10)
|
||||||
|
println(result)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user