Stream API Yazıları 2 – findFirst vs findAny

Merhabalar.

Önceki yazımızda Stream API’ye bir giriş yapmış ve Stream API içerisindeki sık kullanılan metotlara değinmiştik. Bu yazıda da findFirst ve findAny’i kıyaslayıp aralarındaki farka bakacağız.

Şimdi öncelikle findFirst’ü bir hatırlayalım.

List<String> namesList = Arrays.asList("Sebastian Vettel", "Michael Schumacher", "Charles Leclerc");
Optional<String> findFirstResultAsOptional = namesList.stream().findFirst();
findFirstResultAsOptional.ifPresent(System.out::println);

findFirst metodumuz isminden de anladığımız gibi bir Stream içerisindeki ilk veriyi bize veriyor. Yukarıdaki kodumuz da bizim için veri kümesindeki ilk isim olan Sebastian Vettel’i konsola yazdıracak.

Şimdi findAny metodumuzu inceleyelim.

List<String> namesList = Arrays.asList("Sebastian Vettel", "Michael Schumacher", "Charles Leclerc");
Optional<String> findFirstResultAsOptional = namesList.stream().findAny();
findFirstResultAsOptional.ifPresent(System.out::println);

Bu kodu çalıştırdığımızda da konsolda Sebastian Vettel çıktısını göreceğiz ama findFirst’te de aynı çıktıyı almıştık. İkisi arasındaki fark ne bu durumda?

findAny metodu her ne kadar Stream’deki ilk veriyi dönmüş olsa da bu her zaman için garanti edilen bir durum değil. Yani Stream API bize her findAny çağırımında ilk sıradaki elemanı dönerim diye garanti etmiyor fakat findFirst metodu zaten bu işle görevli olduğundan o her zaman ilk veriyi dönecek bize.

Peki findAny’i nasıl efektif kullanabiliriz?

İşte burada Stream API altında yer alan bir başka metot olan parallel() metodunu devreye alabiliriz. Performanslı bir şekilde işlem yapmak istediğimiz zamanlar kullanabileceğimiz parallel() metodu ile findAny üzerinden biraz daha rastgele bir veri elde edebiliriz.

Örneğin şöyle bir kodumuz olsun:

List<String> namesList = Arrays.asList("Sebastian Vettel", "Michael Schumacher", "Charles Leclerc");
Optional<String> findFirstResultAsOptional = namesList.stream().parallel().filter(name -> name.contains("S")).findAny();
findFirstResultAsOptional.ifPresent(System.out::println);

Burada hem Sebastian hem de Schumacher S harfini içeriyor fakat kodu ben çalıştırdığımda Michael Schumacher sonucu verdi. Yani ilk sıradaki veri yerine ikinci sıradakini verdi.

SONUÇ

Bu yazı ile birlikte findFirst ve findAny metotlarını kıyaslamış olduk ve aralarındaki farkı da öğrendik. Gelecek yazıda görüşene kadar hoşçakalın.

Latest posts by İlkay Günel (see all)

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir