Kotlin Flow ve Saz Arkadaşları | Birlikten Kuvvet Doğar— Part 3

Murat YÜKSEKTEPE
3 min readMar 23, 2024

--

Bu bölümde birden fazla Flow’u birleştirme yöntemleri olan şu konulara değineceğiz;

merge(), channelFlow(), zip() ve combine()

merge(aFlow, bFlow, cFlow, …)

Birden fazla flow’u, tek bir flow olacak şekilde birleştirmek için kullandığımız yöntemlerden birisi merge metodudur.

Dikkat edilmesi gereken bir detay; merge ile birleştirilmiş flow’ların tek bir flow üzerinden veri akıtırken birbirlerini beklememesidir. Yani birleşim içinde kullandığımız flow’ların hangisinin işi önce biterse collect’e ilk o veri ulaşır ve gecikmiş olan veri akışı sekteye uğratmaz.

Bu yüzden aşağıdaki örnek kodu çalıştırdığınız zaman her seferinde farklı bir sıralama görebilirsiniz.

Flow — merge()

channelFlow { … }

channelFlow’u ise merge işleminin farklı bir mimari ile yapılabilen hali olarak görebiliriz. Fakat burada asıl amaç birden fazla CoroutineScope’unu birleştirmektir.

channelFlow içinde dikkat etmemiz gereken önemli detay, merge ile aynıdır. Yani birbirinden farklı akışlardan birinin gecikmesi diğer akışları etkilemediği için birleştirilmiş akışı da geciktiremez.

Yapılan testlerde -özellikle yüksek sayıdalardaki emit kullanımları için- flow merge’ün daha performanslı olduğu kaydedilmiştir.

Detaylar için: https://proandroiddev.com/why-use-flow-if-we-have-the-powerful-channelflow-in-mobile-development-1e8e718c80ea

Kotlin Flow ve Geleneksel Polonez Dansı

https://culture.pl/en/article/polonaise-the-royal-dance-every-polish-teenager-has-to-master

zip ve combine’e geçmeden önce bu konu hakkında okumalar yaparken denk geldiğim Marcin Moskała ‘ın şuradaki makalesinde yer alan Polonez dansı örneği beni çok etkiledi ve okuduğum şeyin aklımda kalmasını sağladı. Serinin ilk yazısında bahsettiğim “günlük hayattan örneklendirme yapmak” işte tam olarak böyle bir şey.

Dansın bulabildiğim en uygun videosunu ve konuyla alakalı kısa bölümlerini aşağıda paylaşıyor olacağım.

flowA.zip(flowB)

merge metoduyla birleştirilmiş akışların birbirlerini beklememesi; genel akışın sekteye uğramaması açısından olumluyken, akışlar arasında bir eşleşme/bağlantı kurmak mecburiyetimiz varsa olumsuz sonuçlar doğurabilir.

Eğer iki farklı akışı tek seferde yönetmek ve bir çift (pair) bazlı çıktı dinlemek istersek zip metodunu kullanabiliriz. Zip metodu içerisinde birleşen akışlar bir çift oluşturmak zorundadır bu sebeple üretim hızları ne olursa olsun, oluşan veriyi dinlemek için en uzun süren akışı beklemek zorunda kalırız.

Eğer bir akış diğerinden daha fazla veri üretiyorsa çiftlenemeyen veriler nihai akışta dinlenemez.

Flow — zip()

Polonez dansında bir çiftin beraber hareket edebilmesi için diğer eşin dans figürünün tamamlanmasını beklemesi:

https://youtu.be/OS_gHZjRylc?si=yfocbnYtpUE6f0mL&t=245

flowA.combine(flowB)

2 farklı flow’u birleştirmek için kullandığımız bir diğer yöntem ise combine metodudur. zip metodunda olduğu gibi combine için de 2 farklı akışı birleştirip bir çift (pair) elde ederiz.

Fakat zip’ten en büyük farkı; zip, sıralı bir çift oluşturmak için kullanılırken, combine de çift oluşturmak için sıra gözetilmez.

Birbirinden farklı olan üretim süreleri için çift oluşturma aşaması şöyle çalışır;

— Dinlenen akışlardan ilk hangisinde veri oluşursa bu bir çift oluşturmak için kaydedilir.

— Diğer akışta veri oluştuğu an kayıtlı olan diğer veri ile bir çift oluşur ve tüketim sürecine gönderilir.

— Bundan sonraki süreçte hangi akışta yeni bir veri oluşursa o eskisi ile değiştirilir ama çifti oluşturan diğer veri değişmediği için olduğu gibi kalır.

Flow — combine()

Polonez dansında bir çiftin hareket etmesi için o an karşısına gelen kişi ile bir çift olması:

https://youtu.be/OS_gHZjRylc?si=B_IfFn628D8z-qmB&t=266

--

--