Hayat Kurtaran Java Stream Komutları
Java 8 ile gelen en önemli ve günlük işlerimizi kolaylaştıran Stream’den kendi adıma en çok kullandığım komutları örneklendirmeye çalışacağım.
Çok daha fazlasını aşağıdaki yazılarda bulabilirsiniz.
- https://bilisim.io/2017/01/29/java-8-stream-api-terminal-islemler/
- https://bilisim.io/2017/01/29/java-8-stream-api-intermediate-islemler/
- https://bilisim.io/2017/01/29/java-8-stream-api/
- https://bilisim.io/2021/02/16/fonksiyonel-java/
Of()
Elimizde array ya da bir obje varsa bunu Stream.of() methodu ile stream’lere aşağıdaki gibi çevirebilir ve gerekli methodları çağırabiliriz.
1 2 3 4 5 |
Stream<Customer> customerStream = Stream.of(new Customer("bilisim.io", 5, new ArrayList<Order>())); |
filter()
Klasik for döngüsü ile basit bir kontrol eklemek istesek alttaki gibi tek tek bütün elemanları kontrol eden bir kod parçası ise yapmamız gerekiyordu.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
List<Integer> ageList = new ArrayList<>(); //listeye eleman eklenir ageList.stream().filter(age->age>35).forEach(System.out::println); // ya da filtreleme işlemi sonrası bize bir liste dönebilir ageList.stream().filter(age -> age > 35).toList(); //old school for(Integerage:ageList){ if(age > 35){ System.out.println(age); } } |
forEach()
Her customer’ın yaşına ekleme yapmak istediğimizde aşağıdaki yöntemleri kullanabiliriz
1 2 3 4 5 6 7 8 9 10 11 12 13 |
customers.stream().forEach(customer -> { customer.age += 3; }); // tek satırlık işlem için süslü parantezsin kullanılabilir customers.stream().forEach(customer -> customer.age += 3); // direkt olarak bir method çağırımı da yapabiliriz customers.stream().forEach(CustomerService::incrementCustomerAge); |
map()
Map methodu yeni bir stream oluşturur. Görüldüğü gibi List<Customer> tipinden List<String> tipine geçiş yapabiliriz.
1 2 3 4 5 6 7 8 |
List<String> customerNames = customers.stream() .map(customer -> customer.name) .filter(customerName -> customerName.startsWith("c")) .toList(); |
collect()
Method Collectors tipinde parametre almaktadır. toList(), toSet(), toMap() methodları ile istediğim veri yapısında sonuç dönmesini sağlayabiliriz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Set<String> customerNamesSet = customers.stream() .map(customer -> customer.name) .filter(customerName -> customerName.startsWith("c")) .collect(Collectors.toSet()); List<String> customerNamesList = customers.stream() .map(customer -> customer.name) .filter(customerName -> customerName.startsWith("c")) .collect(Collectors.toList()); Map<String, Integer> customerNamesMap = customers.stream() .filter(customer -> customer.age > 35) .filter(customer -> customer.name.startsWith("c")) .collect(Collectors.toMap(Customer::getName, Customer::getAge)); |
peek()
Çoğu zaman Stream’ler üzerinde birden fazla kez işlem yapmamız gerekiyor. forEach() kullanmak istediğimiz durumda işleme devam edemiyor oluyoruz çünkü kendisi void bir method fakat
peek() methodu bize tekrar Stream dönmektedir.
1 2 3 4 5 6 7 8 9 10 |
List<String> collect = customers.stream().filter(customer -> customer.age > 18) .peek(CustomerService::incrementCustomerAge) .map(customer -> customer.name) .peek(customerName -> customerName = customerName.trim()) .filter(customerName -> customerName.startsWith("c")) .collect(Collectors.toList()); |
orElseThrow()
findFirst() methodu Optional döndüğü için orElseThrow ile istediğimiz hatayı fırlatıp gerekli yerlerde bu hataları yakalayabiliriz.
1 2 3 4 5 6 7 8 |
Customer firstCustomer = customers.stream().filter(customer -> customer.age > 18) .peek(CustomerService::incrementCustomerAge) .findFirst() .orElseThrow(() -> new RuntimeException("Customer not found")); |
Kodlara aşağıdaki linkten ulaşabilirsiniz.
https://gist.github.com/cemdrman/1f876f6103cfb39f0d32370b1856a1cc
Faydalı olması dileğiyle.