Görev tamamlama
- Kotlin kursu
- Başlangıç
- Ders 86/116
- 6 dk
completeTask ile görev durumunu güncellemeyi öğrenirsin.
Görev tamamlama: completeTask ve copy
Bir görevi tamamlamak için completeTask(title) metodu, listede başlığı eşleşen görevi bulup done'ı true yapar. Task veri sınıfı değişmez (immutable) olduğundan, copy(done = true) ile yeni bir kopya oluşturup listedeki yeriyle değiştiririz.
fun completeTask(title: String) {
val i = tasks.indexOfFirst { it.title == title }
if (i >= 0) {
tasks[i] = tasks[i].copy(done = true)
}
}indexOfFirst { } koşula uyan ilk indeksi verir; yoksa -1. i >= 0 denetimi, yalnızca görev bulunduysa güncelleme yapmayı sağlar.
indexOfFirst ve bulunamayan görev
indexOfFirst { koşul } koşula uyan ilk elemanın indeksini verir; hiçbiri uymazsa -1 döner. Bu davranış, completeTask'ın olmayan bir başlık çağrıldığında sessizce hiçbir şey yapmasını sağlar.
val i = tasks.indexOfFirst { it.title == "Yok" }
// i = -1; if (i >= 0) bloğu çalışmazBu "sessiz sessizce geç" yaklaşımı, CLI'da kullanıcı yanlış başlık yazdığında uygulamanın çökmemesini sağlar. İstersen "görev bulunamadı" mesajı da ekleyebilirsin.
Uygulama completeTask metodunu ekle ve çağır
TodoList'e fun completeTask(title: String) metodunu ekle: val i = tasks.indexOfFirst { it.title == title } ile bul, if (i >= 0) bloğunda tasks[i] = tasks[i].copy(done = true) yap. main içinde iki görev ekle, completeTask("Ödev") çağır ve listTasks() ile yazdır.
Başlangıç kodu
fun main() {
val list = TodoList()
list.addTask("Alışveriş")
list.addTask("Ödev")
// "Ödev"i tamamla ve listTasks ile yazdır
}
// Task ve TodoList sınıfları önceki derslerde tanımlandığı gibi durur.
// completeTask metodunu TodoList içine ekle: indexOfFirst ile bul, copy ile güncelle.Örnek çözüm
fun main() {
val list = TodoList()
list.addTask("Alışveriş")
list.addTask("Ödev")
list.completeTask("Ödev")
list.listTasks()
}
data class Task(val title: String, val done: Boolean = false) {
fun format() = if (done) "[x] $title" else "[ ] $title"
}
class TodoList {
val tasks = mutableListOf<Task>()
fun addTask(title: String) {
tasks.add(Task(title))
}
fun listTasks() {
tasks.forEach { println(it.format()) }
}
fun completeTask(title: String) {
val i = tasks.indexOfFirst { it.title == title }
if (i >= 0) {
tasks[i] = tasks[i].copy(done = true)
}
}
}Beklenen çıktı
[ ] Alışveriş [x] Ödev
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 İfadeyi rolüyle eşleştir
| Kavram | Anlamı |
|---|---|
completeTask(title) |
Görevi tamamlar |
indexOfFirst { } |
İlk eşleşmenin indeksi |
copy(done = true) |
Yeni kopya, done = true |
tasks[i] = ... |
Listedeki yeri güncellenir |
2 completeTask nasıl bir güncelleme yapar?
- Yeni bir liste yapar
- copy ile yeni Task yaratıp yerine koyar Doğru cevap
- Eski Task'ı siler
- Task'ı null yapar
Açıklama: Task değişmez olduğundan copy ile yeni kopya yapıp yerine koyarız.
3 Boşluğu doldur: copy ile güncelle
tasks[i] = tasks[i].____(done = true)
tasks[i] = tasks[i].copy(done = true)
Açıklama: tasks[i].copy(done = true) yeni kopya yapar.