Menu
Coddy logo textTech

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
NONE

Kotlin, 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 Int
challenge icon

Görev

Kolay

Herhangi 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>())}")
}
quiz iconKendini test et

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

Kendi başına pratik yap: Kotlin playground