From 9fb97f548f83b4406f5315891c2f29f53f1940d4 Mon Sep 17 00:00:00 2001 From: kennethcheng Date: Mon, 14 Sep 2026 09:00:54 +0800 Subject: [PATCH] =?UTF-8?q?feat:ChatGPT=E7=AC=AC=207=20=E8=AF=BE=EF=BC=9Af?= =?UTF-8?q?oreach=E3=80=81reduce=E3=80=81fold=EF=BC=8C=E5=BC=80=E5=A7=8B?= =?UTF-8?q?=E5=AD=A6=E4=B9=A0=E2=80=9C=E9=81=8D=E5=8E=86=E2=80=9D=E5=92=8C?= =?UTF-8?q?=E2=80=9C=E6=8A=8A=E5=A4=9A=E4=B8=AA=E5=85=83=E7=B4=A0=E8=81=9A?= =?UTF-8?q?=E5=90=88=E6=88=90=E4=B8=80=E4=B8=AA=E7=BB=93=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../comprehensive/Comprehensive.scala | 11 +++++++ src/main/scala/practise7/demo/Demo.scala | 25 +++++++++++++++ .../scala/practise7/demo/Demo1Foreach.scala | 19 ++++++++++++ .../practise7/demo/Demo2ForeachMap.scala | 17 ++++++++++ .../demo/Demo3ForeachUnderscore.scala | 13 ++++++++ .../scala/practise7/demo/Demo4Reduce.scala | 19 ++++++++++++ .../demo/Demo5ReduceUnderscore.scala | 11 +++++++ .../scala/practise7/demo/Demo6ReduceMax.scala | 21 +++++++++++++ src/main/scala/practise7/demo/Demo7Fold.scala | 13 ++++++++ .../practise7/demo/Demo8FoldMultiply.scala | 12 +++++++ .../practise7/exercises/Exercises1.scala | 27 ++++++++++++++++ .../practise7/exercises/Exercises2.scala | 31 +++++++++++++++++++ .../practise7/exercises/Exercises3.scala | 25 +++++++++++++++ .../practise7/exercises/Exercises4.scala | 20 ++++++++++++ .../practise7/exercises/Exercises5.scala | 22 +++++++++++++ .../practise7/exercises/Exercises6.scala | 31 +++++++++++++++++++ 16 files changed, 317 insertions(+) create mode 100644 src/main/scala/practise7/comprehensive/Comprehensive.scala create mode 100644 src/main/scala/practise7/demo/Demo.scala create mode 100644 src/main/scala/practise7/demo/Demo1Foreach.scala create mode 100644 src/main/scala/practise7/demo/Demo2ForeachMap.scala create mode 100644 src/main/scala/practise7/demo/Demo3ForeachUnderscore.scala create mode 100644 src/main/scala/practise7/demo/Demo4Reduce.scala create mode 100644 src/main/scala/practise7/demo/Demo5ReduceUnderscore.scala create mode 100644 src/main/scala/practise7/demo/Demo6ReduceMax.scala create mode 100644 src/main/scala/practise7/demo/Demo7Fold.scala create mode 100644 src/main/scala/practise7/demo/Demo8FoldMultiply.scala create mode 100644 src/main/scala/practise7/exercises/Exercises1.scala create mode 100644 src/main/scala/practise7/exercises/Exercises2.scala create mode 100644 src/main/scala/practise7/exercises/Exercises3.scala create mode 100644 src/main/scala/practise7/exercises/Exercises4.scala create mode 100644 src/main/scala/practise7/exercises/Exercises5.scala create mode 100644 src/main/scala/practise7/exercises/Exercises6.scala diff --git a/src/main/scala/practise7/comprehensive/Comprehensive.scala b/src/main/scala/practise7/comprehensive/Comprehensive.scala new file mode 100644 index 0000000..06de2dd --- /dev/null +++ b/src/main/scala/practise7/comprehensive/Comprehensive.scala @@ -0,0 +1,11 @@ +package practise7.comprehensive + +object Comprehensive { + def main(args: Array[String]): Unit = { + val nums = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) + val result = nums.filter(_ % 2 == 0) + .map(_ * 10) + .reduce(_ + _) + println(result) + } +} diff --git a/src/main/scala/practise7/demo/Demo.scala b/src/main/scala/practise7/demo/Demo.scala new file mode 100644 index 0000000..ae0a757 --- /dev/null +++ b/src/main/scala/practise7/demo/Demo.scala @@ -0,0 +1,25 @@ +package practise7.demo + +/* +* 第 7 课:foreach、reduce、fold,开始学习“遍历”和“把多个元素聚合成一个结果 +* 这一课很重要,因为前面: +*map +*filter +*主要是在“转换和筛选数据”。 +* +*这一课开始学习: +*遍历数据 +*↓ +*执行某个操作 +* +*多个数据 +*↓ +*逐步计算 +*↓ +*最终得到一个结果 +* +*这也是后面学习 Spark 聚合操作的基础。 +*/ +object Demo { + +} diff --git a/src/main/scala/practise7/demo/Demo1Foreach.scala b/src/main/scala/practise7/demo/Demo1Foreach.scala new file mode 100644 index 0000000..4d41aa2 --- /dev/null +++ b/src/main/scala/practise7/demo/Demo1Foreach.scala @@ -0,0 +1,19 @@ +package practise7.demo + +/* +foreach 基本用法 +*/ +object Demo1Foreach { + def main(args: Array[String]): Unit = { + val nums = List(1, 2, 3, 4, 5) + nums.foreach(x => println(x)) // 把 List 中的每一个元素依次交给这个函数。 + + /* + *1 → println(1) + *2 → println(2) + *3 → println(3) + *4 → println(4) + *5 → println(5) + */ + } +} diff --git a/src/main/scala/practise7/demo/Demo2ForeachMap.scala b/src/main/scala/practise7/demo/Demo2ForeachMap.scala new file mode 100644 index 0000000..77acb97 --- /dev/null +++ b/src/main/scala/practise7/demo/Demo2ForeachMap.scala @@ -0,0 +1,17 @@ +package practise7.demo + +/* +foreach 和 map 区别 +*/ +object Demo2ForeachMap { + def main(args: Array[String]): Unit = { + val nums = List(1, 2, 3, 4, 5) + val resultMap = nums.map(_ * 2) + // map👉处理每个元素👉产生一个新的集合 + println(resultMap) + + val resultForeach = nums.foreach(x => println(x)) + // foreach👉处理每个元素👉执行某个动作👉通常不关心返回集合 + println(resultForeach) + } +} diff --git a/src/main/scala/practise7/demo/Demo3ForeachUnderscore.scala b/src/main/scala/practise7/demo/Demo3ForeachUnderscore.scala new file mode 100644 index 0000000..89100e2 --- /dev/null +++ b/src/main/scala/practise7/demo/Demo3ForeachUnderscore.scala @@ -0,0 +1,13 @@ +package practise7.demo + +/* +foreach 也可以使用 _ +*/ +object Demo3ForeachUnderscore { + def main(args: Array[String]): Unit = { + val nums = List(1, 2, 3, 4, 5) + println(nums.foreach(x => println(x))) + println(nums.foreach(println(_))) + println(nums.foreach(println)) + } +} diff --git a/src/main/scala/practise7/demo/Demo4Reduce.scala b/src/main/scala/practise7/demo/Demo4Reduce.scala new file mode 100644 index 0000000..9edd610 --- /dev/null +++ b/src/main/scala/practise7/demo/Demo4Reduce.scala @@ -0,0 +1,19 @@ +package practise7.demo + +/* +reduce:把多个元素变成一个结果 +*/ +object Demo4Reduce { + def main(args: Array[String]): Unit = { + val nums = List(1, 2, 3, 4, 5) + val result = nums.reduce((a, b) => a + b) + // 不断把两个元素合并,最后得到一个结果。 + println(result) + /* + 1 + 2 = 3 + 3 + 3 = 6 + 6 + 4 = 10 + 10 + 5 = 15 + */ + } +} diff --git a/src/main/scala/practise7/demo/Demo5ReduceUnderscore.scala b/src/main/scala/practise7/demo/Demo5ReduceUnderscore.scala new file mode 100644 index 0000000..262b7d0 --- /dev/null +++ b/src/main/scala/practise7/demo/Demo5ReduceUnderscore.scala @@ -0,0 +1,11 @@ +package practise7.demo + +/* +* reduce(_ + _) +*/ +object Demo5ReduceUnderscore { + def main(args: Array[String]): Unit = { + val nums = List(1, 2, 3, 4, 5) + println(nums.reduce(_ + _)) + } +} diff --git a/src/main/scala/practise7/demo/Demo6ReduceMax.scala b/src/main/scala/practise7/demo/Demo6ReduceMax.scala new file mode 100644 index 0000000..ae6ed2f --- /dev/null +++ b/src/main/scala/practise7/demo/Demo6ReduceMax.scala @@ -0,0 +1,21 @@ +package practise7.demo + +/* +* reduceMax +* reduce是把集合中的元素按照某种规则不断合并成一个结果。 +*/ +object Demo6ReduceMax { + def main(args: Array[String]): Unit = { + val nums = List(10, 5, 30, 20) + + val result = nums.reduce((a, b) => { + if (a > b) a else b + }) + + println(result) + + // 也可以写成 + val result2 = nums.reduce((a, b) => if (a > b) a else b) + println(result2) + } +} diff --git a/src/main/scala/practise7/demo/Demo7Fold.scala b/src/main/scala/practise7/demo/Demo7Fold.scala new file mode 100644 index 0000000..f3c6d2b --- /dev/null +++ b/src/main/scala/practise7/demo/Demo7Fold.scala @@ -0,0 +1,13 @@ +package practise7.demo + +/* +* fold 基本用法 +* fold 可以提供一个初始值。 +*/ +object Demo7Fold { + def main(args: Array[String]): Unit = { + val nums = List(1, 2, 3, 4, 5) + val result = nums.fold(5)(_ + _) // 5 + 1 + 2 + 3 + 4 + 5 = 20,初始值为5 + println(result) + } +} diff --git a/src/main/scala/practise7/demo/Demo8FoldMultiply.scala b/src/main/scala/practise7/demo/Demo8FoldMultiply.scala new file mode 100644 index 0000000..fbe1f34 --- /dev/null +++ b/src/main/scala/practise7/demo/Demo8FoldMultiply.scala @@ -0,0 +1,12 @@ +package practise7.demo + +/* +* fold 也不只是求和 +*/ +object Demo8FoldMultiply { + def main(args: Array[String]): Unit = { + val nums = List(1, 2, 3, 4, 5) + val result = nums.fold(2)(_ * _) // 2 * 1 * 2 * 3 * 4 * 5 = 240 + println(result) + } +} diff --git a/src/main/scala/practise7/exercises/Exercises1.scala b/src/main/scala/practise7/exercises/Exercises1.scala new file mode 100644 index 0000000..7bd5be5 --- /dev/null +++ b/src/main/scala/practise7/exercises/Exercises1.scala @@ -0,0 +1,27 @@ +package practise7.exercises + +/* +* 练习 1:foreach +val nums = List(1, 2, 3, 4, 5) + +使用 foreach,依次打印: +1 +2 +3 +4 +5 + +尝试两种写法: +nums.foreach(x => println(x)) + +以及: +nums.foreach(println) +观察两者是否一样。 +*/ +object Exercises1 { + def main(args: Array[String]): Unit = { + val nums = List(1, 2, 3, 4, 5) + nums.foreach(x => println(x)) + nums.foreach(println) + } +} diff --git a/src/main/scala/practise7/exercises/Exercises2.scala b/src/main/scala/practise7/exercises/Exercises2.scala new file mode 100644 index 0000000..f79d174 --- /dev/null +++ b/src/main/scala/practise7/exercises/Exercises2.scala @@ -0,0 +1,31 @@ +package practise7.exercises + +/* +练习 2:foreach + if +val nums = List(1, 2, 3, 4, 5, 6) + +使用 foreach: +只打印偶数 + +结果: +2 +4 +6 + +提示: +if (x % 2 == 0) { + println(x) +} +*/ + +object Exercises2 { + def main(args: Array[String]): Unit = { + val nums = List(1, 2, 3, 4, 5, 6) + val result = nums.foreach(x => + if (x % 2 == 0) { + println(x) + } + ) + println(result) + } +} diff --git a/src/main/scala/practise7/exercises/Exercises3.scala b/src/main/scala/practise7/exercises/Exercises3.scala new file mode 100644 index 0000000..5740401 --- /dev/null +++ b/src/main/scala/practise7/exercises/Exercises3.scala @@ -0,0 +1,25 @@ +package practise7.exercises + +/* +* 练习 3:reduce 求和 +val nums = List(1, 2, 3, 4, 5) + +使用: + +reduce + +得到: + +15 + +要求尽量使用: + +_ +* */ +object Exercises3 { + def main(args: Array[String]): Unit = { + val nums = List(1, 2, 3, 4, 5) + val result = nums.reduce(_ + _) + println(result) + } +} diff --git a/src/main/scala/practise7/exercises/Exercises4.scala b/src/main/scala/practise7/exercises/Exercises4.scala new file mode 100644 index 0000000..d698df4 --- /dev/null +++ b/src/main/scala/practise7/exercises/Exercises4.scala @@ -0,0 +1,20 @@ +package practise7.exercises + +/* +练习 4:reduce 求最大值 +val nums = List(10, 20, 5, 30, 15) + +使用 reduce 找出最大值: +30 + +这里可以继续使用: +if (a > b) a else b +*/ +object Exercises4 { + def main(args: Array[String]): Unit = { + val nums = List(10, 20, 5, 30, 15) + val result = nums.reduce((a, b) => if (a > b) a else b) + println(result) + } + +} diff --git a/src/main/scala/practise7/exercises/Exercises5.scala b/src/main/scala/practise7/exercises/Exercises5.scala new file mode 100644 index 0000000..464bcb4 --- /dev/null +++ b/src/main/scala/practise7/exercises/Exercises5.scala @@ -0,0 +1,22 @@ +package practise7.exercises + +/* +练习 5:fold 求和 +val nums = List(1, 2, 3, 4, 5) + +使用: +fold + +并指定初始值: +0 + +最终得到: +15 +*/ +object Exercises5 { + def main(args: Array[String]): Unit = { + val nums = List(1, 2, 3, 4, 5) + val result = nums.fold(0)(_ + _) + println(result) + } +} diff --git a/src/main/scala/practise7/exercises/Exercises6.scala b/src/main/scala/practise7/exercises/Exercises6.scala new file mode 100644 index 0000000..6e3a0fa --- /dev/null +++ b/src/main/scala/practise7/exercises/Exercises6.scala @@ -0,0 +1,31 @@ +package practise7.exercises + +/* +练习 6 ⭐ + +给: +val nums = List(1, 2, 3, 4, 5) + +分别使用: +reduce +fold + +计算乘积: +120 + +也就是: +1 × 2 × 3 × 4 × 5 + +fold 使用初始值: +1 +*/ +object Exercises6 { + def main(args: Array[String]): Unit = { + val nums = List(1, 2, 3, 4, 5) + val resultFold = nums.fold(1)(_ * _) + println(resultFold) + + val resultReduce = nums.reduce(_ * _) + println(resultReduce) + } +}