CodeBlanks Logo Icon CodeBlanks

Birleştirme

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

Main.kt
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

Main.kt
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

Soru
fun bookFlow(): Flow<Book> = listAll().____()
Cevap
fun bookFlow(): Flow<Book> = listAll().asFlow()

Açıklama: asFlow() listeyi bir Flow'a çevirir.

Orta seviye bölümündeki tüm dersler