这两个惟一不同的是计算的初始值(sum为0,product为1)和计算操作符(sum为+,product为*)
Reduce便可用于快速完成这类操作,通过指定一个初始值和一个组合元素的方法
Swift中reduct在Array类中的定义为
public func reduce<Result>(_ initialResult: Result,_ nextPartialResult: (Result,Element) throws -> Result) rethrows -> Result
接收两个参数,一个为类型Result的初始值,另一个为把类型为Result的元素和类型为Element的元素组合成一个类型为Result的值的函数。
最终结果整个数组就变成了一个类型为Result的值。
在事例中Result和Element是Int,初始值是0,combine函数计算两个Int之和
和计算改写成:
sum=moneyArray.reduce(0,{$0+$1})
Swift中操作符可用着函数,可简化成:
reduce可能是高阶函数中最难理解的一个。 需要注意的是combine函数的两参数类型不同,$0为计算结果类型,$1为数组元素类型。
另一点需要说明的是数据比较大的时候,高阶函数会比传统实现更快,因为它可以并行执行(如运行在多核上)。
下面是reduce的两种用法。其实都一样,只是第二种更简洁,但是比较难懂,这两个方法都是返回数组中有多少个不相同的数。
extension Array where Element: Comparable {
func countUniques() -> Int {
let sorted = self.sorted(by: <)
let initial: (Element?,Int) = (.none,0)
let reduced = sorted.reduce(initial) { (result,item) -> (Element?,Int) in
if result.0 == item {
return (item,result.1)
}else {
return (item,result.1+1)
}
}
return reduced.1
}
func countTheUnique() -> Int {
let sorted = self.sorted(by: <)
let initial: (Element?,0)
let result = sorted.reduce(initial,{($1,$0.0 == $1 ? $0.1 : $0.1+1)})
return result.1
}
//第二种可以一行代码完成
func countUnique() -> Int {
return self.sorted(by: <).reduce((.none,0),$0.0 == $1 ? $0.1 : $0.1+1)}).1
}
}
print([10,2,3,4,5,1].countTheUnique()) // 6
print([10,1].countUnique()) // 6
print([10,1].countUniques()) // 6