Swift集合函式:Reduce、Map、FlatMap、Filter

Mitsui_發表於2018-01-02

Reduce

宣告

func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result
複製程式碼

Returns the result of combining the elements of the sequence using the given closure.

使用給定的block來組合集合中的元素,並且返回組合後的結果

引數

initialResult

The value to use as the initial accumulating value. initialResult is passed to nextPartialResult the first time the closure is executed.

初始值

nextPartialResult

A closure that combines an accumulating value and an element of the sequence into a new accumulating value, to be used in the next call of the nextPartialResult closure or returned to the caller.

帶有兩個引數的block,block的第一個引數為之前的計算結果,如果是第一次計算,則預設為initialResult。第二個引數為集合中的下一個元素。返回值為遍歷完整個集合後的組合結果。block中可以定義兩個引數的組合規則。

例如

let da = [1, 2, 3, 4, 5]
let sum = da.reduce(0) { (result: Int, ele: Int) -> Int in
	return result + ele
}
// sum = 15
複製程式碼

對陣列da中的元素求和,第一個引數0為初始值,當陣列第一次執行result + ele //ele = data[0]時,此時的result即為初始值。

可簡寫為

let da = [1, 2, 3, 4, 5]
let sum = da.reduce(0) {
	return $0 + $1
}
// sum = 15
複製程式碼

或者

let da = [1, 2, 3, 4, 5]
let sum = da.reduce(0, +)
// sum = 15
複製程式碼

注:Swift中操作符為函式,函式允許使用和block具有相同引數的函式作為引數代替block

上述程式碼的作用相當於

let da = [1, 2, 3, 4, 5]
var sum = 0
for i in 0..<da.count {
	sum += da[i]
}
// sum = 15
複製程式碼

Map & FlatMap

Map

Returns an array containing the results of mapping the given closure over the sequence’s elements.

使用給定的block將陣列對映為一個新的陣列。新的陣列元素為block中設定的對映規則確定。

引數:

transform

A mapping closure. transform accepts an element of this sequence as its parameter and returns a transformed value of the same or of a different type.

一個block,引數為陣列中的一個元素,block返回一個使用對映規則轉換之後的元素。

例如

let cast = ["Vivien", "Marlon", "Kim", "Karl"]
let lowercaseNames = cast.map { $0.lowercased() }
// 'lowercaseNames' == ["vivien", "marlon", "kim", "karl"]
let letterCounts = cast.map { $0.count }
// 'letterCounts' == [6, 6, 3, 4]
複製程式碼

FlatMap

flatMap(_:)map(_:)一樣,也是可以將一個集合通過某種對映規則對映為另一個集合,不同的地方是,flatMap(_:)會將對映之後的元素強解包(unwraped),如果遇到nil,則將其過濾到,返回的新集合為過濾掉nil之後的集合;map(_:)返回的元素為Optional型別元素,如果集合中有nil,則返回的集合中也包·括nil,其他元素均為Optional型別。 例如:

let cast = [nil, "Marlon", "Kim", "Karl"]
let uppercaseNames = cast.map { $0?.uppercased() } //1
// 'uppercaseNames' = [nil, Optional("MARLON"), Optional("KIM"), Optional("KARL")]
let foo = cast.flatMap { $0?.uppercased() }//2
// 'foo' = ["MARLON", "KIM", "KARL"]
複製程式碼

1、將陣列cast對映為一個新的陣列,給定的對映規則是$0?.uppercased(),即將陣列中的字串全部轉換成大寫的形式,返回的新陣列的元素為optional型別。

2、將陣列cast對映為一個新的陣列,給定的對映規則是$0?.uppercased(),即將陣列中的字串全部轉換成大寫的形式,並且將返回的陣列元素解包, 如果元素為nil,則過濾掉。

Filter

Returns an array containing, in order, the elements of the sequence that satisfy the given predicate.

返回一個陣列,該陣列按順序包含滿足給定謂詞的序列元素。

引數

isIncluded

A closure that takes an element of the sequence as its argument and returns a Boolean value indicating whether the element should be included in the returned array.

一個block,將集合的元素作為引數,並返回一個Boolean,用來指示這個元素是否包含在返回的陣列中,如果包括,則將其新增入陣列。

例如

let cast = ["Vivien", "Marlon", "Kim", "Karl"]
let shortNames = cast.filter { $0.count < 5 }
print(shortNames)
// Prints "["Kim", "Karl"]"
複製程式碼

上述程式碼的作用為:篩選出名字的字數小於5的名字,{ $0.count < 5 }這個block為篩選的謂詞,$0為block的引數,即shortNames的元素。

相關文章