Seriyi takip edenlerin bildiği üzere Reactive Programming paradigmasına daha efektif giriş yapmak için bazı tanımalamalar / karşılaştırmalar yapmaktayız. Takip edemeyip etmek isteyenler buraya -> Reactive Programming bir göz atabilirler.
Hemen hemen bütün programlama dillerinde yapılan işlemler fonksiyon / metotların döndürdüğü değerlere (return) bağlı değil midir? İşte tam olarak bu döndürme işleminin yaşam döngüsüne bir bakıp çıkacağız.
Herhangi bir metot için Stream Return veya Collection Return yapılmasındaki farklar nelerdir? Metot / fonksiyon yaptığı işlemler sonucunda bir Stream döndürdüğünde neler oluyor? Collection döndürdüğünde neler oluyor?
Hepimizin bildiği gibi collection’lar belirli bir gruptaki verileri çeşitli algoritmalar altında tutmaya ya da gruplamaya ve bu verilerin üzerinde işlem/hesap yapmamıza olanak yarayan yapılardır. Yani collection’ları hem verileri tutmak/saklamak için hem de bu veriler üzerinde işlem yapmak için kullanıyoruz.
Stream’ler de ise durum biraz farklıdır. Verileri tutmaktan ziyade veriler üzerinde işlem yapmaya yoğunlaşır. Örneğin collections yapısında yaratılan veri bloğu üzerinde defalarca işlem yapılabilirken streams yapısında bu mümkün değildir. Yani streams altında bir veri bloğu oluşturulup işlendikten sonra aynı veri bloğunda tekrar işlem yapılamaz. Tekrar işlem yapmak için blok tekrar oluşturulmalı ve işleme alınmalıdır. Bu nokta “Collections vs Streams” karşılaştırmasındaki en ilgi çekici ve dikkat edilmesi gereken başlıktır.
Stream’lerin oluşturulması hakkında bilgi edinmek için -> Java 8 Stream API makalesine kısa bir göz atabilirsiniz.
Stream’ler aynı zamanda collection’lar üzerinde de işlem yapabilirler. Yani collection’ları bir veri bloğu olarak kullanabilirler. Bu durumda veri işlemede oldukça kullanışlı metotları bize sunarlar. (filter, map, count vb…) -> Java 8 Stream API Doc
Belki de karşılaştırmadaki en önemli nokta bu yapıların veri ele alma şekilleri olarak karşımıza çıkmaktadır.
Dedik ya; herhangi bir metod için Stream Return veya Collection Return yapılmasının farkı nedir? Java NIO Path ile basit bir işlem yaptığımızı düşünelim. Bu işleme bağlı olarak yaratılan metotların bir veriyi return etmesini yani işlemesini kabaca inceleyelim.
1 2 |
static List<String> readAllLinesByCollection(Path path) static Stream<String> readAllLinesByStream(Path path) |
Böyle bir işlemde bir sonuç/return üretmek için
Evet, readAllLinesByStream ile bir veri tutma/storage edilmediğinden bir kazanç oluştu. Sizlere daha çok kazandıracak bir sır/örnek vereyim mi?
Bu dosyada herhangi bir arama/search işlemi yaptığımızı düşünelim. Ya da herhangi bir veri bloğunda bir arama/search yaptığımızı düşünelim. Bu durumda collections ve streams sonuç/return döndürmek için nasıl bir yol izleyecektir?
Böyle bir senaryoda collection kullanmanın hatta bu senaryoyu büyük projelerde defalarca ve büyük veriler üzerinde kullanmanın getireceği maaliyetleri yani kaynak israfını düşününce stream alt yapısının önem derecesi ortaya çıkmaktadır.
Stream’lerin çalışma mantığına değindiğimize göre stream’ler…
Stream’ler hangi koşullarda tercih edilmelidir?
Limit, belirli, kalıcı ve tekrar tekrar kullanılması gereken bir data bloğu var ise Collection’lar tercih edilebilir.
Bu serinin ilk makalesinde ->Reactive Programlama Nedir? ifade ettiğimiz gibi reaktif programlamada stream’ler önemli bir yer kaplamaktadır. Bu makalede de veri yönetiminde sağladıkları avantajlar ile neden önemli olduğuna küçük de olsa bir ışık tutmaya çalıştık. Bir sonraki makalede de inşaallah Reactive Streams ve Asynchronous Streams konusunu ele almaya çalışacağız.