Scala for Backend Engineering & Functional Programming · 课时

集合上的函数式操作

掌握 map、filter、fold 和 reduce 等常见函数式操作,用于转换数据。

第 2 / 3 课11 个步骤

集合上的函数式操作 是 CoddyKit 上的免费 Scala for Backend Engineering & Functional Programming 课时。 这是第 2 节课,共 3 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Scala for Backend Engineering & Functional Programming 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Scala for Backend Engineering & Functional Programming 课程共包含 3 节课。

函数式操作:为什么使用它们?

集合上的函数式操作可以帮助您在不修改原集合的情况下转换和组合数据。这种方式提倡不可变性,也让代码更易于阅读和测试。

我们将探索 map、filter、reduce 和 fold 等关键操作。

使用 `map` 进行转换

map 操作会对集合中的每个元素应用一个函数,并返回包含转换结果的新集合。原集合保持不变。

请尝试运行以下示例:

object Main {
  def main(args: Array[String]): Unit = {
    val numbers = List(1, 2, 3, 4)
    val doubled = numbers.map(n => n * 2)
    println(s"Original: $numbers")
    println(s"Doubled: $doubled")
  }
}

适用于不同类型的 `map`

map 非常灵活!您可以将元素转换为完全不同的类型。在这里,我们将数字转换为字符串,或者获取字符串的长度。

请注意,尽管输入是 List[String],结果仍然是 List[Int]。

object Main {
  def main(args: Array[String]): Unit = {
    val names = List("Alice", "Bob", "Charlie")
    val lengths = names.map(name => name.length)
    println(s"Names: $names")
    println(s"Lengths: $lengths")
  }
}

使用 `filter` 进行筛选

filter 操作会创建一个新集合,其中只包含满足给定条件(谓词函数)的元素。它会“筛除”不需要的元素。

让我们找出偶数:

object Main {
  def main(args: Array[String]): Unit = {
    val numbers = List(1, 2, 3, 4, 5, 6)
    val evens = numbers.filter(n => n % 2 == 0)
    println(s"Original: $numbers")
    println(s"Evens: $evens")
  }
}

更多 `filter` 示例

您可以使用任何布尔表达式作为筛选条件。让我们筛选一个单词列表,只保留长度超过 4 个字符的单词。

object Main {
  def main(args: Array[String]): Unit = {
    val words = List("apple", "cat", "banana", "dog", "elephant")
    val longWords = words.filter(w => w.length > 4)
    println(s"Words: $words")
    println(s"Long words: $longWords")
  }
}

使用 `reduce` 进行组合

reduce 操作会将集合中的所有元素组合成单个结果。它接受一个二元操作(即接受两个参数并返回一个结果的函数),并以累积方式应用该操作。

在这里,我们将所有元素相加:

object Main {
  def main(args: Array[String]): Unit = {
    val numbers = List(1, 2, 3, 4)
    val sum = numbers.reduce((a, b) => a + b)
    println(s"Numbers: $numbers")
    println(s"Sum: $sum")
  }
}

使用 `reduce` 求乘积和最大值

reduce 可以执行各种聚合操作。我们可以计算数字的乘积,或找出最大值。

注意:对空集合使用 reduce 会抛出错误。

object Main {
  def main(args: Array[String]): Unit = {
    val numbers = List(1, 5, 2, 8)
    val product = numbers.reduce((a, b) => a * b)
    val maxNum = numbers.reduce((a, b) => if (a > b) a else b)
    println(s"Numbers: $numbers")
    println(s"Product: $product")
    println(s"Max: $maxNum")
  }
}

`fold`:初始值的作用

fold 与 reduce 类似,但有一个重要区别:它接受一个初始值(也称为“累加器”)。因此,它可以安全地处理空集合,也允许使用不同的结果类型。

让我们从 10 开始对数字求和:

object Main {
  def main(args: Array[String]): Unit = {
    val numbers = List(1, 2, 3)
    // foldLeft(initialValue)(operation)
    val sumWithInitial = numbers.foldLeft(10)((acc, n) => acc + n)
    println(s"Numbers: $numbers")
    println(s"Sum (starting from 10): $sumWithInitial")
  }
}

方向:`foldLeft` 与 `foldRight`

Scala 提供了 foldLeft 和 foldRight。它们在元素的处理顺序以及累加器的传递方式上有所不同。

  • foldLeft(initial)(op):从左到右处理。
  • foldRight(initial)(op):从右到左处理。

对于字符串拼接等操作,方向非常重要!

object Main {
  def main(args: Array[String]): Unit = {
    val chars = List('a', 'b', 'c')
    val leftFold = chars.foldLeft("")((acc, c) => acc + c)
    val rightFold = chars.foldRight("")((c, acc) => acc + c)
    println(s"Chars: $chars")
    println(s"foldLeft: $leftFold") // Output: abc
    println(s"foldRight: $rightFold") // Output: abc (due to string append order)

    // Example where order matters: (acc, char) => char + acc
    val rightFoldReversed = chars.foldRight("")((c, acc) => c + acc)
    println(s"foldRight (char + acc): $rightFoldReversed") // Output: abc

    // A common example where order matters is for operations like subtraction or division, but string concatenation also shows it.
  }
}

函数式操作检查

请考虑以下 Scala 代码片段:

val data = List(10, 20, 30, 40)
val result1 = data.map(x => x / 10)
val result2 = data.filter(x => x > 25)
val result3 = data.reduce((a, b) => a + b)

以下哪些说法正确描述了这些结果?

回顾:函数式操作的作用

您已经掌握了重要的函数式操作!

  • map 转换每个元素。
  • filter 根据条件选择元素。
  • reduce 将元素组合成单个结果(要求集合非空)。
  • fold 使用初始值组合元素(可安全处理空集合)。

这些操作对于编写简洁、不可变且功能强大的 Scala 代码非常重要。接下来,我们将使用 Option、Try 和 Either 探索可靠的错误处理。

免费开始

用 AI 导师学习 Scala — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
39
课程
143

常见问题解答

「集合上的函数式操作」课时是免费的吗?

是的 — 「集合上的函数式操作」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Scala for Backend Engineering & Functional Programming 课程的其余内容,请升级到 CoddyKit PRO。 Scala for Backend Engineering & Functional Programming 课程共包含 3 节课。

「集合上的函数式操作」这节课中我会学到什么?

掌握 map、filter、fold 和 reduce 等常见函数式操作,用于转换数据。 你通过在浏览器中直接运行的动手代码来练习 Scala for Backend Engineering & Functional Programming,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Scala for Backend Engineering & Functional Programming 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Scala for Backend Engineering & Functional Programming 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 3 节。

「集合上的函数式操作」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Scala for Backend Engineering & Functional Programming 课中编写并运行代码吗?

能。每节 Scala for Backend Engineering & Functional Programming 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 深入理解不可变集合
  2. 集合上的函数式操作
  3. 使用 Option、Try 和 Either 处理错误
← 返回 Scala for Backend Engineering & Functional Programming