0

Java 8 Stream API ve Uygulamaları

Merhaba arkadaşlar bu yazıda Java 8 ile birlikte gelen Streams filter(), collect() , findAny() gibi bazı metodların nasıl kullanıldığı ile ilgili bilgiler vermeye çalışıp bazı örnek uygulamalar yapacağım. İngilizce bazı kaynaklardan araştırarak hazırladığım bu yazı inşallah faydalı olur. 

Stream Nesneleri java’daki collection nesneleri ile kullanılan bir api. Elimizdeki bir koleksiyondan istediğimiz değerleri alabilmek , çekebilmek için kullanılan kullanışlı metodları var ki aşağıda örneklerini verdiğimde daha da kolayca ne olduğu hakkında bilgi sahibi olacaksınız. 

Bu stream Api’sinin özelliklerine bakarsak 

  • İçlerinde veri tutan bir yapı değildir. Sadece Koleksiyon nesnelerinin tutukları verileri işleme alırlar.
  • Sizin orijinal koleksiyon yapınızı bozmazlar sadece kendine özgü metodlar ile verileri işlerler

Farklı operasyon nesneleri vardır.
Intermediate Operations:

  1. map: Geçerli nesnenin elemanlarını alıp işlem yapıyor ve başka bir listeye elaman oluşturuyor.
    List<Integer> number = Arrays.asList(2,3,4,5);
    List<Integer> square = number.stream().map(o -> o*o).collect(Collectors.toList());
  2. filter: Seçilen bir değere göre filtreleme işlemi yapar
    List names = Arrays.asList("Reflection","Collection","Stream");
    List result = names.stream().filter(s->s.startsWith("S")).collect(Collectors.toList());
  3. sorted: Stream nesnesini sort etmek için kullanılır
    List names = Arrays.asList("Reflection","Collection","Stream");
    List result = names.stream().sorted().collect(Collectors.toList());

Terminal Operations:

  1. collect: Collect metodu intermediate operatörlerle yapılan işlemleri sonuçta bir liste olarak geri döndürür.
    List number = Arrays.asList(2,3,4,5,3);
    Set square = number.stream().map(x->x*x).collect(Collectors.toSet());
  2. forEach: bilgdiğimiz foreach yapısı gibi elemanlar üzerinde gezmeyi sağlar
    List number = Arrays.asList(2,3,4,5);
    number.stream().map(x->x*x).forEach(y->System.out.println(y));
  3. reduce: Stream nensesinin elemanlarını tek bir değere azaltmak için kullanılır
    List number = Arrays.asList(2,3,4,5);
    int even = number.stream().filter(x->x%2==0).reduce(0,(ans,i)-> ans+i);

     

1. Streams filter() and collect()

Java 8 öncesi bir listede filtreleme işlemi yapacak olursak şöyle bir örnek buna açıklık getirebilir.

Java8 öncesi örnek,

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

public class BeforeJava8 {

    public static void main(String[] args) {

        List<String> lines = Arrays.asList("elma", "armut", "çilek");
        List<String> result = getFilterOutput(lines, "armut");
        for (String temp : result) {
            System.out.println(temp);    //çıktı: elma, çilek
        }

    }

    private static List<String> getFilterOutput(List<String> lines, String filter) {
        List<String> result = new ArrayList<>();
        for (String line : lines) {
            if (!"armut".equals(line)) { // armut'u almıyoruz
                result.add(line);
            }
        }
        return result;
    }

}

Aynı örneği java 8 ile birlikte gelen stream.filter() ile listemizi filtereleyerek ve collect() ile stream’i yine listeye çevirelim.

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class NowJava8 {

    public static void main(String[] args) {

        List<String> lines = Arrays.asList("elma", "armut", "çilek");

        List<String> result = lines.stream()                // listeyi bir stream 'e çevirelim
                .filter(line -> !"armut".equals(line))     // armut ifadesini istemiyoruz
                .collect(Collectors.toList());              // tekrardan stream'i bir listeye çevirelim

        result.forEach(System.out::println);                //çıktı: elma, çilek

    }

}

2. Streams filter(), findAny() and orElse()

// Person.java
public class Person {

    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //gettersm setters, toString
}

Java8 öncesinde adı verdiğimiz bir personel için Person nesnesine şu şekilde erişebiliyorduk.

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

public class BeforeJava8 {

    public static void main(String[] args) {

        List<Person> persons = Arrays.asList(
                new Person("mkyong", 30),
                new Person("jack", 20),
                new Person("lawrence", 40)
        );

        Person result = getStudentByName(persons, "jack");
        System.out.println(result);

    }

    private static Person getStudentByName(List<Person> persons, String name) {

        Person result = null;
        for (Person temp : persons) {
            if (name.equals(temp.getName())) {
                result = temp;
            }
        }
        return result;
    }
}
// Ekran Çıktısı
Person{name='jack', age=20}

Java8 ile birlikte şu şekilde …

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

public class NowJava8 {

    public static void main(String[] args) {

        List<Person> persons = Arrays.asList(
                new Person("mkyong", 30),
                new Person("jack", 20),
                new Person("lawrence", 40)
        );

        Person result1 = persons.stream()                        // Stream nesnesine çeviriyoruz
                .filter(x -> "jack".equals(x.getName()))        // sadece adı "jack" olanları alacaz
                .findAny()                                      // Eğer şarta uyan bir değer varsa döner
                .orElse(null);                                  // yoksa null döner

        System.out.println(result1);
        
        Person result2 = persons.stream()
                .filter(x -> "ahmook".equals(x.getName()))
                .findAny()
                .orElse(null);

        System.out.println(result2);

    }

}

Ekran Çıktısı
Person{name='jack', age=20}
null

Birden fazla şart yazmak isterseniz

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

public class NowJava8 {

    public static void main(String[] args) {

        List<Person> persons = Arrays.asList(
                new Person("mkyong", 30),
                new Person("jack", 20),
                new Person("lawrence", 40)
        );

        Person result1 = persons.stream()
                .filter((p) -> "jack".equals(p.getName()) && 20 == p.getAge())
                .findAny()
                .orElse(null);

        System.out.println("result 1 :" + result1);

        //or like this
        Person result2 = persons.stream()
                .filter(p -> {
                    if ("jack".equals(p.getName()) && 20 == p.getAge()) {
                        return true;
                    }
                    return false;
                }).findAny()
                .orElse(null);

        System.out.println("result 2 :" + result2);

    }


}

Ekran Çıktısı

result 1 :Person{name='jack', age=20}
result 2 :Person{name='jack', age=20}

3. Streams filter() and map()

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class NowJava8 {

    public static void main(String[] args) {

        List<Person> persons = Arrays.asList(
                new Person("mkyong", 30),
                new Person("jack", 20),
                new Person("lawrence", 40)
        );

        String name = persons.stream()
                .filter(x -> "jack".equals(x.getName()))
                .map(Person::getName)                        //Stream nesnesini String e çeviriyor
                .findAny()
                .orElse("");

        System.out.println("name : " + name);

        List<String> collect = persons.stream()
                .map(Person::getName)
                .collect(Collectors.toList());

        collect.forEach(System.out::println);

    }
    
}

Ekran Çıktısı

name : jack

mkyong
jack
lawrence

Kaynak: 

https://www.geeksforgeeks.org/stream-in-java/

https://www.mkyong.com/java8/java-8-streams-filter-examples/

admin

Bir cevap yazın

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