Java 24 Stream Gatherers Nedir?
JDK 24, 18 Mart 2025 tarihinde yayınlandı ve bir çok yenilik sunuldu. Bu yazıda benim de oldukça dikkatimi çeken Stream Gatherers’in ne olduğunu açıklamaya çalışacağım.
Java 8 ile birlikte hayatımıza Stream API’ler girdi ve oldukça fazla kullanmaktayız. filter
, collect
gibi özellikler ara işlemleri getiren Stream API’ler, Stream Gatherers sayesinde daha fazlasını yapmamıza olanak tanıyacak.
Stream Gatherers
JEP 485 ile tanıtılan ve Java 24 ile resmi olarak duyurulan Stream Gatherers, bir stream’in elemanlarını işleyen ve yeni elemanlara dönüştürmemize olanak sağlayan yapıyı getirdi.
Stream Gatherers Metotları
Kendiliğinden gelen implementasyonlara bakalım.
Gatherers.fold
Stream içerisindeki işlemler sonucundaki değeri birleştirerek tek bir değer döndürmektedir.
Stream.of("B", "U", "R", "A", "K")
.gather(Gatherers.fold(() -> "", (a, b) -> a + b))
.forEach(System.out::println);
//BURAK
Code language: Java (java)
reduce
‘a benzese de fold
‘un öne çıkan özelliği, farklı veri türlerini birleştirmede ortaya çıkmaktadır.
Gatherers.scan
Stream içerisinde dolaşarak kümülatif sonuç döndürür.
Stream.of("B", "U", "R", "A", "K")
.gather(Gatherers.scan(() -> "", (acc, element) -> acc + element))
.forEach(System.out::println);
//B
//BU
//BUR
//BURA
//BURAK
Code language: Java (java)
Gatherers.windowSliding
Stream içindeki elemanları, belirtilen boyutta kayan elemanlı gruplamayı sağlamaktadır.
Stream.of(1,2,3,4,5,6,7,8).gather(Gatherers.windowSliding(2)).toList();
// [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7], [7, 8]]
Code language: Java (java)
Gatherers.windowFixed
Stream içindeki elemanlardan sabit gruplara ayırmaya olanak tanır.
Stream.of(1,2,3,4,5,6,7,8).gather(Gatherers.windowFixed(3)).toList();
// [[1, 2, 3], [4, 5, 6], [7, 8]]
Code language: JavaScript (javascript)
Gatherers Interface
4 durumdan oluşmaktadır:
- initializer: Başlangıç durumunu oluşturur.
- integrator: Elemanları işler ve sonuçları akışa gönderir.
- combiner: Paralel işleme için durumları birleştirir.
- finisher: İşlem tamamlandığında yapılacakları belirler.
Bu interfaceleri kullanarak özelleştirilmiş Gatherers yapabilirsiniz.
Gatherers Uygulama Ornegi
Bu örnekte, stream içerisindeki değerleri her state göre ()
içinde işlemlerimizi yapabiliyoruz. Bu örnekte, elemanların karesini alan ve 25’ten büyük değerleri döndüren bir Gatherers örneği yaptık:
Gatherer<Integer, List<Integer>, Integer> squareAndFilter = Gatherer.of(
() -> new ArrayList<Integer>(),
(state, element, downstream) -> {
int squared = element * element;
if (squared > 25) {
downstream.push(squared);
}
state.add(element);
return true;
},
(state1, state2) -> {
state1.addAll(state2);
return state1;
},
(state, downstream) -> {
System.out.println("İşlenen toplam eleman: " + state.size());
}
);
List<Integer> numbers = List.of(2, 3, 4, 5, 6, 7, 8);
List<Integer> results = numbers.stream()
.gather(squareAndFilter)
.toList();
// İşlenen toplam eleman: 7
// [36, 49, 64]
Code language: Java (java)
2. satır: initializer
, başlangıç durumunu belirtir.
3. satır: integrator
, elemanları işleyen bloktur ve downstream.push()
diyerek stream’e gönderir.
11. satır: combiner
, işlem sonucunda oluşan iki listeyi birleştirir.
15. satır: finisher
iişlem sonunda yapılacak son adımı belirler.
Tabii ki burada hepsini kullanmak zorunda değiliz. Her ()
blok bir işlemi ifade etmektedir.
Sonuç
Java 24 ile gelen bu yeniliği projelerinize entegre akış işleme konusunda çok daha ileri seviye işlemler yapabilirsiniz.
No Comment! Be the first one.