Generic Fonksiyonlar
Coddy'nin Kotlin Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 37 / 57.
Bir jenerik fonksiyon herhangi bir türle çalışır. Fonksiyon adından önce açılı parantezler içinde yazılan tür parametresi, çağıranın kullandığı türü temsil eder. T yaygın olarak kullanılan addır:
fun <T> firstOr(list: List<T>, default: T): T = if (list.isEmpty()) default else list[0]main içinde:
println(firstOr(listOf(3, 5), 0) + 1)
println(firstOr(listOf<String>(), "none").uppercase())Çıktı:
4
NONEKotlin, tür argümanını argümanlardan çıkarır. Çıkarım yapabileceği bir şey olmadığında, yukarıdaki listOf<String>() örneğinde olduğu gibi bunu kendiniz yazarsınız:
fun <T> repeatItem(item: T, times: Int): List<T> = List(times) { item }main içinde:
println(repeatItem("ab", 3))
println(repeatItem(7, 2))
val empty = repeatItem<Double>(1.5, 0)
println(empty)Çıktı:
[ab, ab, ab]
[7, 7]
[]Bir işlevin birkaç tür parametresi olabilir ve bir işlev türü parametresi bunları kullanabilir. Kütüphane işlevleri map her öğe ve sonuç türü için bu şekilde çalışır:
fun <A, B> transform(items: List<A>, f: (A) -> B): List<B> {
val out = mutableListOf<B>()
for (item in items) out.add(f(item))
return out
}
fun <K, V> invert(map: Map<K, V>): Map<V, K> = map.entries.associate { (k, v) -> v to k }main içinde:
println(transform(listOf("kiwi", "fig")) { it.length })
println(invert(mapOf("a" to 1, "b" to 2)))Çıktı:
[4, 3]
{1=a, 2=b}Bir tür parametresi, çağıranın türünü korur. firstOr(listOf(3, 5), 0) bir Int döndürür; bu nedenle + 1 derlenir. List<Any> için yazılmış bir sürüm de her listeyi kabul ederdi, ancak Any döndürür ve her çağrıda tür dönüşümü yapılmasını zorunlu kılardı:
fun firstAny(list: List<Any>, default: Any): Any = if (list.isEmpty()) default else list[0]
// firstAny(listOf(3, 5), 0) + 1 // hata: Any'nin plus'ı yok
(firstAny(listOf(3, 5), 0) as Int) + 1 // derlenir, ama bir cast gerektirir
firstOr(listOf(3, 5), 0) + 1 // jenerik: sonuç bir IntGörev
KolayHerhangi bir türdeki listelerle çalışan iki genel işlev yazın. countWhere(items, predicate), bir yüklem olan (T) -> Boolean işlevinden geçen öğelerin sayısını döndürür. mostCommon(items), en sık görünen öğeyi (sayılar eşit olduğunda listede ilk görünen öğeyi) veya boş bir liste için null değerini döndürür.
Sağlanan kod bir sözcük satırı ve bir sayı satırı okur; 3 harften uzun sözcüklerin sayısını, en sık görülen sözcüğü, çift sayıların sayısını, en sık görülen sayıyı ve boş bir liste için nothing: null değerini yazdırır.
Kodunuz ListTools.kt dosyasına yazılmalıdır. Main.kt sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
fun main() {
// Sağlanan giriş/çıkış kodu: olduğu gibi bırakın
val input = generateSequence(::readLine).toList()
val words = input[0].split(" ")
val numbers = input[1].split(" ").map { it.toInt() }
println("long words: ${countWhere(words) { it.length > 3 }}")
println("most common word: ${mostCommon(words)}")
println("even numbers: ${countWhere(numbers) { it % 2 == 0 }}")
println("most common number: ${mostCommon(numbers)}")
println("nothing: ${mostCommon(listOf<String>())}")
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Sınıflar ve Nesneler
Dosyalarla ÇalışmaSınıfları TanımlamaBirincil Yapıcılarinit Blokları ve Doğrulamaİkincil YapıcılarTekrar - Kütüphane Kartı4Kalıtım
Açık Sınıflar ve Alt SınıflarÜyeleri Geçersiz Kılmasuper ve YapıcılarSoyut SınıflarTekrar - Personel Dizini2Özellikler ve Kapsülleme
Özel ErişimcilerGörünürlük DeğiştiricileriÖzel Setter'larlazy ve lateinitTekrar - Banka Hesabı5Arayüzler
Arayüz BildirimleriVarsayılan MetotlarBirden Çok ArayüzTür Olarak ArayüzlerÖzet - Ödeme Yöntemleri8Generic'ler
Generic FonksiyonlarGeneric SınıflarTür Kısıtlamalarıin ve out ile VaryansTekrar - Öncelik Kuyruğu11Proje: Kütüphane Yönetimi
Kitaplar ve ÜyelerKitap Ödünç AlmaKendi başına pratik yap: Kotlin playground