函数式学习 - map、filter 和 reduce

/*
 使用了 map、  filter 和 reduce 的小实例。
 假设我们有下面这样的结构体,其定义由城市的名字和人口 (单位为千居⺠) 组成:
 */

struct City {
    let name: String
    let population: Int
}

let paris = City(name: "Paris", population: 2241)
let madrid = City(name: "Madrid", population: 3165)
let amsterdam = City(name: "Amsterdam", population: 827)
let berlin = City(name: "Berlin", population: 3562)

let cities = [paris, madrid, amsterdam, berlin]

/*
假设我们现在想筛选出居⺠数量至少一百万的城市,并打印一份这些城市的名字及总人口数的列表。我们可以定义一个辅助函数来换算居⺠数量:
*/

extension City {
    func cicyByScalingPopulation() -> City {
        return City(name: name, population: population * 1000)
    }
}

let cititesAllpop =
    cities.filter { $0.population > 1000 }
        .map { $0.cicyByScalingPopulation() }
        .reduce("City: Population") { result, c in
            return result + "\n" + "\(c.name): \(c.population)"
}
//过滤 -> 转换 -> 相加
     /* 另外:
      flatMap
      很像map
      函数,但是它摒弃了那些值为nil 的元素。另外一个与map
      函数不同之处在于:倘若元素值不为nil情况下,flapMap
      函数能够将可选类型(optional)转换为非可选类型(non-optionals)
       */
print(cititesAllpop)
//遍历 不操作 .forEach
/*
 // =
 City: Population
 Paris: 2241000
 Madrid: 3165000
 Berlin: 3562000

 我们首先将居⺠数量少于一百万的城市过滤掉。然后将剩下的结果通过 cityByScalingPopulation 函数进行 map 操作。最后,使用 reduce 函数来构建一个包含城市 名字和人口数量列表的 String。这里我们使用了 Swift 标准库中 Array 类型的 map、  lter 和 reduce 定义。于是,我们可以顺利地链式使用过滤和映射的结果。表达式 cities .  lter (..) 的 结果是一个数组,对其调用 map;然后这个返回值调用 reduce 即可得到最终结果。
 */

你可能感兴趣的:(函数式学习 - map、filter 和 reduce)