Birleştirme
- Kotlin kursu
- Orta seviye
- Ders 116/116
- 6 dk
Tüm katmanları birleştirerek çalışan bir uygulama yazarsın.
Birleştirme: Flow ile akış
Son derste tüm parçaları birleştirip Library'ye bir Flow metodu ekleyeceksin. fun bookFlow(): Flow<Book> = listAll().asFlow() kitapları bir akış olarak sunar; collect ile her kitabı tek tek tüketebilirsin. Bu, dosyaya kaydetme ve akış tabanlı tüketimi bir araya getirir.
fun bookFlow(): Flow<Book> = listAll().asFlow()
fun main() = runBlocking {
lib.bookFlow().collect { println(it.format()) }
}Burada asFlow() bir listeyi akışa çevirir; her eleman sırayla emit edilir. collect her kitabın format çıktısını yazdırır. runBlocking, main'de coroutine köprüsü kurar. Flow, büyük koleksiyonları tembel (lazy) tüketmek için idealdir; tüm liste belleğe yüklenmez.
Tüm parçaları birleştir
Son uygulama şu parçaları birleştirir: data class Book (veri modeli), sealed class Category (OOP hiyerarşi), class Library (koleksiyon yönetimi), save/load (dosya I/O) ve bookFlow (asenkron akış). Her parça önceki derslerde hazırlandı; şimdi hepsi bir arada çalışır.
fun main() = runBlocking {
val lib = Library()
lib.add(Book("Suç ve Ceza", "Dostoyevski", 1866, Fiction))
lib.save("kutuphane.txt")
lib.bookFlow().collect { println(it.format()) }
}Burada kitap eklenir, dosyaya kaydedilir, ardından Flow ile akışta tüketilir. Bu, orta seviye Kotlin'in tüm temel kavramlarını (OOP, koleksiyonlar, dosya I/O, Flow) birleştiren bir uygulamadır. İleride bu yapıya arama, filtreleme veya kullanıcı arayüzü eklenebilir. Tasarım, her parçanın bağımsız test edilebilmesine olanak tanır.
Uygulama bookFlow ekle ve tüm uygulamayı çalıştır
Hazır koddaki tüm tanımlar hazır (Book, Category, Library, save/load). Sen Library sınıfına fun bookFlow(): Flow<Book> = listAll().asFlow() ekle. main fonksiyonunu fun main() = runBlocking { ... } biçiminde yaz. İçinde val lib = Library() oluştur; iki kitap ekle; lib.save("kutuphane.txt") çağır; lib.bookFlow().collect { println(it.format()) } ile her kitabı yazdır. Gerekli importlar (java.io.File, kotlinx.coroutines.flow.*, kotlinx.coroutines.runBlocking) hazır kodda bulunur.
Başlangıç kodu
import java.io.File
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.runBlocking
data class Book(val title: String, val author: String, val year: Int, val category: Category) {
fun format(): String = "$title - $author ($year) [${category.label()}]"
}
sealed class Category {
abstract fun label(): String
}
object Fiction : Category() {
override fun label() = "Roman"
}
object NonFiction : Category() {
override fun label() = "İnceleme"
}
class Library {
private val books = mutableListOf<Book>()
fun add(b: Book) { books.add(b) }
fun listAll(): List<Book> = books.toList()
fun save(path: String) {
val content = books.joinToString("\n") { it.format() }
File(path).writeText(content)
}
fun load(path: String): String {
return File(path).readText()
}
}
// Library'ye bookFlow(): Flow<Book> ekle: listAll akışını döndürsün
// main: iki kitap ekle, save("kutuphane.txt") çağır
// runBlocking içinde bookFlow akışını topla ve her kitabın format çıktısını yazdır
fun main() {
// buraya yaz
}Örnek çözüm
import java.io.File
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.runBlocking
data class Book(val title: String, val author: String, val year: Int, val category: Category) {
fun format(): String = "$title - $author ($year) [${category.label()}]"
}
sealed class Category {
abstract fun label(): String
}
object Fiction : Category() {
override fun label() = "Roman"
}
object NonFiction : Category() {
override fun label() = "İnceleme"
}
class Library {
private val books = mutableListOf<Book>()
fun add(b: Book) { books.add(b) }
fun listAll(): List<Book> = books.toList()
fun save(path: String) {
val content = books.joinToString("\n") { it.format() }
File(path).writeText(content)
}
fun load(path: String): String {
return File(path).readText()
}
fun bookFlow(): Flow<Book> = listAll().asFlow()
}
fun main() = runBlocking {
val lib = Library()
lib.add(Book("Suç ve Ceza", "Dostoyevski", 1866, Fiction))
lib.add(Book("Sapiens", "Harari", 2011, NonFiction))
lib.save("kutuphane.txt")
lib.bookFlow().collect { println(it.format()) }
}Beklenen çıktı
Suç ve Ceza - Dostoyevski (1866) [Roman] Sapiens - Harari (2011) [İnceleme]
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Bu uygulamada Flow ne için kullanılır?
- Dosya sıkıştırma için
- Veri tabanı bağlantısı için
- Kitapları akış olarak sunmak için Doğru cevap
- Arayüz çizimi için
Açıklama: Flow, kitapları akış tabanlı tüketmek için kullanılır.
2 Uygulama parçalarını eşle
| Kavram | Anlamı |
|---|---|
data class Book |
Veri modeli |
sealed class Category |
OOP hiyerarşi |
class Library |
Koleksiyon yönetimi |
fun bookFlow |
Asenkron akış |
3 Listeyi akışa çevir
fun bookFlow(): Flow<Book> = listAll().____()
fun bookFlow(): Flow<Book> = listAll().asFlow()
Açıklama: asFlow() listeyi bir Flow'a çevirir.