Swift3.0 关于reduce函数,知道这些就够了
2017-03-24 13:43
621 查看
reduce方法把数组元素组合计算为一个值。
我们使用上面例子计算数组元素的和,结果应该为107(10 + 20 + 45 + 32)
传统实现:
再看看数字相乘
这两个惟一不同的是计算的初始值(sum为0,product为1)和计算操作符(sum为+,product为*)
Reduce便可用于快速完成这类操作,通过指定一个初始值和一个组合元素的方法
Swift中reduct在Array类中的定义为
接收两个参数,一个为类型Result的初始值,另一个为把类型为Result的元素和类型为Element的元素组合成一个类型为Result的值的函数。
最终结果整个数组就变成了一个类型为Result的值。
在事例中Result和Element是Int,初始值是0,combine函数计算两个Int之和
和计算改写成:
Swift中操作符可用着函数,可简化成:
reduce可能是高阶函数中最难理解的一个。 需要注意的是combine函数的两参数类型不同,$0为计算结果类型,$1为数组元素类型。
另一点需要说明的是数据比较大的时候,高阶函数会比传统实现更快,因为它可以并行执行(如运行在多核上)。
下面是reduce的两种用法。其实都一样,只是第二种更简洁,但是比较难懂,这两个方法都是返回数组中有多少个不相同的数。
我们使用上面例子计算数组元素的和,结果应该为107(10 + 20 + 45 + 32)
传统实现:
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中操作符可用着函数,可简化成:
sum = moneyArray.reduce(0,+)
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?, Int) = (.none, 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), {($1, $0.0 == $1 ? $0.1 : $0.1+1)}).1 } } print([10,2,3,4,5,5,5,1].countTheUnique()) // 6 print([10,2,3,4,5,5,5,1].countUnique()) // 6 print([10,2,3,4,5,5,5,1].countUniques()) // 6
相关文章推荐
- 关于VIM,知道这些就够了
- java初学者关于编码问题,知道这些就够了
- Swift中的Protocol知道这些就够了
- 关于期权的若干硬知识,知道这些就不那么担心了
- 关于期权的若干硬知识,知道这些就不那么担心了
- 关于点击率模型,你知道这三点就够了 点击率预估的几个经典模型简介
- 【C++】:关于C++的这些概念你知道吗?
- 关于iPhone 6的A8芯片我们已经知道这些
- 关于git你需要知道这些
- 关于软件文档 这些你知道吗?
- 关于三星最新手机Galaxy S5 你需要知道这些
- Swift面试题,看这些就够了
- 关于软件文档 这些你知道吗?
- Swift3.0中关于日期类的使用指引
- 关于DNS,你应该知道这些
- 关于支付宝提现收费,这些误区和攻略你应该知道
- 关于 SSL 及 CA 证书,你可能需要知道这些
- 关于单例模式----这些你都知道吗?
- c++11 你需要知道这些就够了
- 关于软件文档 这些你知道吗?