map vs filter vs compactMap vs reduce
Map, filter, compactMap ve reduce; swift ile geliştirme yaparken oldukça sık kullanacağınız yüksek mertebeli fonksiyonlar bazılarıdır. Özellik ilk kez kullanılmaya başlandığında oldukça birbirine karışan bir fonksiyonlardır. Ayrıca mülakatlarda da spesifik olarak sorulan bir konudur. Bu konu ile ilgili detaylı bir çok yazı bulunmaktadır. Ancak bu yazıda tablo şeklinde özetlemek istiyorum. Ayrıca diğer kaynaklarıda aşağıda paylaşıyorum.
Kullanım alanı ile ilgili temel örnekler:
Map: Bir array içerisinde her bir item'lara bir işlem için kullanılmaktadır.
let squares2 = values.map {$0 * $0}
// [4.0, 16.0, 25.0, 49.0]
Filter: Adından da anlaşılacağı gibi array'de belirlediğimiz kriterlere göre filtreleme işlemi yapmaktadır.
let digits = [1,4,10,15]
let even = digits.filter { $0 % 2 == 0 }
// [4, 10]
CompactMap: Eski adı flatMap idi ancak swift 4.1'den sonra compactMap olarak değiştirildi. Bir array'de nil item'ları çıkarmaktadır.
let keys: [String?] = ["Tom", nil, "Peter", nil, "Harry"]
let validNames = keys.compactMap { $0 }
validNames
// ["Tom", "Peter", "Harry"]
let counts = keys.compactMap { $0?.count }
counts
// [3, 5, 5]
Reduce: Başlangıç değeri ve birleştirme kapanışı (combine closure) olmak üzere iki değer almaktadır. Kapanış parantezi içerisinde ki başlangıç değeri ile uygular. örnek ile daha anlaşılır olacaktır.
let items = [2.0,4.0,5.0,7.0]
let total = items.reduce(10.0, +)
// 28.0
let codes = ["abc","def","ghi"]
let text = codes.reduce("", +)
// "abcdefghi"
let names = ["Taylor", "Paul", "Adele"]
let count = names.reduce(0) { $0 + $1.count }
//15
Map | Filter | CompactMap | Reduce |
---|---|---|---|
each and every | meet condition | compactMap is used to flatten a collection of collections | all to one |
Use map to loop over a collection and apply the same operation to each element in the collection | Use filter to loop over a collection and return an Array containing only those elements that match an include condition | Removing optionals | Use reduce to combine all items in a collection to create a single new value |