函数式编程

温馨提示:本文最后更新于2024-07-31 19:23:05,某些文章具有时效性,若有错误或已失效,请在下方留言

运用五项原则,帮助实现函数式编程的优势。

  • 函数是一等数据类型,可以像整数和字符串一样被创建、复制和传递。【一等数据类型】
  • 函数是一等数据类型,所以它们可以用作其他函数的参数。【高阶函数】
  • 为了使我们的函数能以各种方式重复使用,在给定特定输入时,函数应始终返回相同的输出,并且不会产生任何副作用。【纯函数】
  • 由于函数在给定输入时总是返回相同的输出,因此我们应优先使用不可变的数据类型,而不是使用函数来改变可变变量。【不变性】
  • 由于我们的函数不会产生副作用,而且变量都是不可变的,因此我们可以减少程序中的状态跟踪量,甚至可以完全消除状态跟踪。【还原状态】

map()

map() 方法从一个容器中取出一个值,对其应用一个函数,然后将该函数的结果放回一个新容器中,并返回给您。

func lengthOf(strings: [String]) -> [Int] {
    return strings.map { $0.count }
}

实例

将字符串转换为大写字母

let fruits = ["Apple", "Cherry", "Orange", "Pineapple"]
let upperFruits = fruits.map { $0.uppercased() }

整数分数数组转换为格式化字符串

let scores = [100, 80, 85]
let formatted = scores.map { "Your score was \($0)" }

可选 map

var username: String? = fetchUsername(id: 1989)
let formattedUsername = username.map { "Welcome, \($0)!" } ?? "Unknown user"
print(formattedUsername)

forEach

forEach是对数组进行循环,并在每个项上执行一个函数。map()forEach 的主要区别:map()返回一个新的数组项,而forEach()则什么也不返回–它只是一种对每个项进行循环的功能性方法。

forEach()保证按顺序遍历数组元素,而map()则可以随意按顺序遍历。

["Taylor", "Paul", "Adele"].forEach { print($0) }

compactMap()

Swift 有一种特殊形式的map() 叫做compactMap(),它会在map()操作完成后执行压缩步骤:所有可选项都会被解包,任何包含 nil 的可选项都会被丢弃。

let albums: [String?] = ["Fearless", nil, "Speak Now", nil, "Red"]
let result = albums.map { $0 }
print(result)

打印内容

[Optional(“Fearless”), nil, Optional(“Speak Now”), nil, Optional(“Red”)]

let albums: [String?] = ["Fearless", nil, "Speak Now", nil, "Red"]
let result = albums.compactMap { $0 }
print(result)

打印内容

[“Fearless”, “Speak Now”, “Red”]

flatMap()

flatMap( ) 方法是map() 方法的另一种变体,也是序列和可选项的变体。这两种变体的目标相同,线索就在名称中,都是扁平化map操作。

someArray.flatMap(transformFunction)
Array(someArray.map(transformFunction).joined())

filter()

filter()方法会循环遍历集合中的每个条目,并将其传递到你编写的函数中。如果你编写的函数对该项目返回 true,它将被包含在一个新数组中,这就是filter() 的返回值。

let fibonacciNumbers = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
let evenFibonacci = fibonacciNumbers.filter { $0 % 2 == 0 }

实例

let names = ["Michael Jackson", "Taylor Swift", "Michael Caine", "Adele Adkins", "Michael Jordan"]
let result = names.filter { $0.hasPrefix("Michael") }

reduce()

reduce()方法通过对每个项应用一个函数,将数组压缩成一个单一的值。每次调用函数时,都会从函数中传递上一个值以及数组中的下一个项。

let scores = [100, 90, 95]
let sum = scores.reduce(0, +)
© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容