Bu Sayfayı Paylaş:

Kavram

Stream

Tanım: Java 8 versiyonu gelen, birden fazla elemanı olan bir yapı için, filtre, aggregate fonksiyonlar (sum, count vb..), map-reduce tarzı işlemleri kolay bir şekilde (lambda ve functional interface kullanarak) yapılmasını sağlayan özellik. Örneğin myobject.stream().filter(b -> b.getColor() == RED).mapToInt(b -> b.getWeight()).sum() ifadesinde önce filtre uygulanmış, çıkan sonuçlardan her elemanın weight değerleri ile yeni bir liste oluşturmuş ve en sonunda da oluşan son liste elemanları toplamıştır.

Veri

Stream İlgili Method'lar

Stream sınıfı ve ondan türeyen sınıflarda çok sayıda method bulunur. Bu method'ların önemlileri aşağıdaki gibi gruplandırılabilir:
  • Filtreleme (Belirli koşula uyanlar alınarak yeni bir Stream verilir)
    • Stream filter(Predicate predicate) : Verilen predicate'in (bir değer alan ve boolean değer döndüren bir functional interface) true döndürdüklerini alır diğer elemanlar elenir
    • Stream distinct() : Distinct (benzersiz) kayıtların listesini verir
    • Stream limit(long maxSize) : İlk maxsize ile belirtilen adet eleman alınır
    • range(int startInclusive, int endExclusive) : IntStream, DoubleStream gibi Stream'lerde belirli aralıkta olan liste için Stream döner
  • Search / Seçme / Azatlma (Belirli özelliklere uygun kayıt seçilir)
    • Optional findFirst() : İlk elemanı döner
    • Optional max(Comparator comparator) : Bir Comparator'e göre maximum elemanı döner
    • Optional min(Comparator comparator) : Bir Comparator'e göre min elemanı döner
    • R collect(Collector collector) : Collector kullanarak stream'i bir collection türüne çevirir
  • Map'leme (Bir listeden her elemana karşlık bir eleman gelecek şekilde yeni bir liste oluşturma)
    • Stream map(Function mapper) : Verilen function'a (bir değer alan ve bir değer döndüren functional interface) eleman verilir ve farklı bir tipte eleman alınır. Yeni elemanlardan bir liste oluşur yani elemanları bir başka listeye map eder
    • IntStream mapToInt(ToIntFunction mapper) : Elemanları bir int değerine map’ler
    • LongStream mapToLong(ToLongFunction mapper) : Elemanları bir long değerine map’ler
    • DoubleStream mapToDouble(ToDoubleFunction mapper) : Elemanları bir double değerine map'ler
  • Aggregate İşlemler / Reduce (count ,sum gibi bir değer döndüren fonksiyonlar, reduce ile sonuç alınması)
    • long count() : listenin eleman sayısını verir
    • sum () : IntStream, DoubleStream gibi stream'lerde toplan değeri döndürür
    • OptionalDouble average() : IntStream, DoubleStream gibi stream'lerde ortalamayı verir
    • Optional reduce(BinaryOperator accumulator) : BinaryOperator'den geçirilip tek bir değer alınır
    • T reduce(T identity, BinaryOperator accumulator) : Bir başlangıç değeri ve BinaryOperator'den geçirilip tek bir değer alınır
  • Operasyon / İşlem (Liste elemanları bazı işlemlerden geçirilir)
    • static Stream empty() : Boş bir stream döndürür
    • void forEach(Consumer action) : Elemanlara sırayla Consumer (Bir değer alan ve değer döndürmeyen functional interface) method'u uygulanır.
    • Stream sorted() : Sıralar
    • Stream sorted(Comparator comparator) : Bir comparator ile sıralar

Örnek

Bir Integer Dizisinin Elemanlarının Karalerinin Toplamının Stream İle Bulunması

Aşağıdaki örnekte bir Integer dizisinin, tüm elemanlarının karaleri alınıp toplanmaktadır :
package com.test.stream;

import java.util.Arrays;
import java.util.List;

public class StreamTest {
	
	public static void main(String[] args) {
		
		List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);	
		
		int sum = list.stream()
			.filter(number -> number % 2 == 0)
			.mapToInt(number -> number * number)
			.sum();
		
		System.out.println("elemanların karelerinin toplamı : "+sum);
		
	}

}
list.stream() ile Stream başlatılır. .filter(number -> number % 2 == 0) ile sadece çift sayılar alınır. .mapToInt(number -> number * number) ile her elemanın karesi alınıp yeni bir liste oluşturulur ve en son toplam değeri alınır.

Örnek

Sınıvda Başarılı Olan Öğrencileri Stream İle Bulan Bir Örnek

Aşağıdaki örnekte bir sınavda 50 ve üzeri alan öğrencileri bulan ve onu en yüksek puandan en düşük puana gelecek şekilde sıralayan ve ekrana basan örnek aşağıdaki gibidir :
package com.test.stream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StreamTestExam {
	
	public static void main(String[] args) {
		
		List<ExamResult> results=new ArrayList<ExamResult>();
		results.add(new ExamResult("Ali Kaya", 56));
		results.add(new ExamResult("Veli Deniz", 60));
		results.add(new ExamResult("Ayşe Gül", 14));
		results.add(new ExamResult("Ahmet Güler", 44));
		results.add(new ExamResult("Arzu Yanar", 80));
		
		List<ExamResult> resultList=results.stream()
			.filter(result -> result.getPoint() >= 50)
			.sorted((result1,result2) -> 
				((Integer)result2.getPoint()).compareTo(result1.getPoint()))
			.collect(Collectors.toList());
		
		resultList.forEach(r -> System.out.println(r.getName()+":"+r.getPoint()));
		
	}
}
ExamResult sınıfı aşağıdaki gibidir:
package com.test.stream;
public class ExamResult {
	
	public ExamResult(String name, int point) {
		this.name=name;
		this.point=point;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getPoint() {
		return point;
	}
	public void setPoint(int point) {
		this.point = point;
	}
	
	private String name;
	private int point;
	
}
İlk önce .filter(result -> result.getPoint() >= 50) ile 50 ve üstünü almış öğrencileri alıyoruz. .sorted((result1,result2) -> ((Integer)result2.getPoint()).compareTo(result1.getPoint())) ile öğrencileri sınav sorularına göre ters olarak sıralıyoruz. (result2 ile result1 ters sırada olduğuna dikkat ediniz). Ardından .collect(Collectors.toList()); ile sonucu bir listeye dolduruyoruz. En sondaki satırda ise tüm elemanları ekrana bastırıyoruz :
Arzu Yanar:80
Veli Deniz:60
Ali Kaya:56
Listeyi almadan da bastırabilirdik :
results.stream()
.filter(result -> result.getPoint() >= 50)
.sorted((result1,result2) -> 
	((Integer)result2.getPoint()).compareTo(result1.getPoint()))
.forEach(r -> System.out.println(r.getName()+":"+r.getPoint()));

Burada collect ile bir listeye doldurmak yetine doğrudan foreach'i çalıştırdık.



Bu Sayfayı Paylaş:

İletişim Bilgileri

Takip Et

Her Hakkı Saklıdır. Bu sitede yayınlanan tüm bilgi ve fikirlerin kullanımından fibiler.com sorumlu değildir. Bu sitede üretilmiş , derlenmiş içerikleri, fibiler.com'u kaynak göstermek koşuluyla kendi sitenizde kullanılabilirsiniz. Ancak telif hakkı olan içeriklerin hakları sahiplerine aittir