在Swift语言中使用Map、Filter、Reduce对Array、Dictionary等集合类型(collection type)进行 *** 作可能对一部分人来说还不是那么的习惯。对于没有接触过函数式编程的开发者来说,对集合类型中的数据进行处理的时候第一反应可能就是采用for in遍历。本文将介绍一些Swift中可以采用的新方法。
MapMap函数会遍历集合类型并对其中的每一个元素进行同一种的 *** 作。Map的返回值是一个所得结果的数组。例如:我们要对一个数组里面的数据进行平方 *** 作,常见的代码如下:
let values: [Double]= [2.0,4.0,6.0,8.0]var squares: [Double] = []for value in values { squares.append(value * value)}
上面的代码中,我们使用了常规的for in遍历 *** 作对其中的元素进行了平方 *** 作,然后将计算的结果追加到一个变量数组里面。虽然该部分的代码很好的完成了要求,但是在Swift中我们还有更简洁和安全的代码(上面的squaers是一个变量可能出现无意的数据修改)。下面来看看使用Map进行 *** 作的代码:
let values: [Double]= [2.0,8.0]let squares: [Double] = values.map{squares * map}
该段代码不仅更加简洁而且map是一个不可变的常量。
上面代码中的
let values: [Double]= [2.0,8.0]let squares: [Double] = values.map({ (value: Double)-> Double in return value * value})函数的闭包语法可能对于新手比较难以理解,该闭包中只有一行对集合中数据进行处理的代码并且最终返回了结果数组。为了大家更好的理解()的 *** 作上面的代码可以改写为:
let squares: [Double] = values.map{value in value * value}
上面这段改写的代码中闭包里面传入了一个Double类型的参数,并且返回了一个相同类型的处理结果。因为map只需要一个闭包最为参数,所以我们可以使用尾数闭包的特性去除value,而且闭包里面的代码也只有一行我们可以利用单表达式的隐式返回省略return:
let squares: [Double] = values.map{let scores = [0,28,124]let words = scores.map { NSNumberFormatter.localizedStringFromNumber(*let digits = [1,4,10,15] let even = digits.filter {,numberStyle: .SpellOutStyle) }//["zero","twenty-eight","one hundred twenty-four"]let items = [2.0,5.0,7.0] let total = items.reduce(10.0,combine: +) //28.0% 2 == 0 } // [4,10]let codes = ["Big","nerd","Coding"] let text = codes.reduce("",combine: +) // "BignerdCoding"}
上面
let codes = ["Big","Coding"] let text = codes.reduce("v2ex") {text,name in "\(text),\(name)"}// "v2ex,Big,nerd,Coding"也可以直接使用闭包的参数缩写功能给替换掉:
let collections = [[5,2,7],[4,8],[9,1,3]] let flat = collections.flatMap {let codes: [String?] = ["Big",nil,"Coding"] let values = codes.flatMap {} // [5,7,8,9,3]let collections = [[5,3]] let onlyEven = collections.flatMap { intArray in intArray.filter {} // ["Big","Coding"]let collections = [[5,3]] let onlyEven = collections.flatMap { collections in [5,7].filter {% 2 == 0 } }// [2,8]//与map *** 作的组合以及简写let allSquared = collections.flatMap { intArray in intArray.map {% 2 == 0 } }// [2,8]let marks = [4,5,7] let totalPass = marks.filter{* } } // [25,49,16,64,81,9]let allSquared = collections.flatMap { .map { * } }//与reduce *** 作的组合以及对等的组合 *** 作let sums = collections.flatMap { .reduce(0,combine: +) }//对应的组合 *** 作,两者结果是一样的let sums = collections.map { .reduce(0,combine: +) }let numbers = [20,17,35,12] let evenSquares = numbers.map{ * }.filter{ % 2 == 0} // [400,144]>= 7}.reduce(0,combine: +) // 24
map *** 作返回的结果数组中元素的类型并不要求与原来的元素类型一致,例如我们可以将一个常见的数字数组转为对应的单词数组:
当然除了上面的Array,Set和Dictionary也能应用map *** 作。
FilterFilter函数 *** 作会对集合类型进行遍历并将其中的满足条件的元素作为结果数组中的元素进行返回。该函数里面只有一个作为条件判断的语句,闭包会遍历集合里面的元素并将满足条件的结果放在一起:
ReduceReduce函数 *** 作会将集合类型里面的所有元素组合成一个新值并返回。reduce中的参数为两个:一个初始值、一个combine闭包。例如下面的代码将数组中的元素相加并且其中的初始值为10:
除了上面的数字类型之外也可以对字符串进行处理:
reduce中第二个参数是一个闭包,所有你可以使用尾随闭包来自我特定 *** 作:
FlatMap该函数会将那些多维集合类型转换为一维集合类型,实例如下:
另外对于可选类型的集合类型来说该函数还能将其中的空值移除掉:
正在体现flatMap强大功能的地方是与上面一个函数进行组合 *** 作:
上面的代码实现了将多维整形数组里面的偶数筛选出来并且组合成了一个一位数组。flatMap *** 作的参数是一个以[Int]数组作为参数的闭包。当然我们也可以使用隐含参数对其进行简写:
注意:上面简写中第一个和第二个表示中类似的字数组,而第三个则表示子数组里面的每个整数
与其它 *** 作进行组合的实例:
链式组合我们在上面已经看到了flatMap的闭包里面可以与另一 *** 作的组合。我们还可以在闭包的外面对这些 *** 作进行合理的组合来实现我们的目标。例如将数组中大于某个数字的所有数字进行求和 *** 作:
或者对某一个数组里面的数字进行平方 *** 作然后在进行筛选:
总结下次你要对集合类型的元素进行遍历并对其中的每个元素进行处理的时候,可以先检查一下是否可以直接使用上面的这些 *** 作或者组合 *** 作。
总结以上是内存溢出为你收集整理的Swift函数编程之Map、Filter、Reduce全部内容,希望文章能够帮你解决Swift函数编程之Map、Filter、Reduce所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)