20 Eylül 2015 Pazar

Java 8 Stream Sınıfları


Functional Paketi
Java 8 Functional Kavramları yazısına taşıdım.

Arayüzler
Tüm arayüzler BaseStream<T>'den kalıtıyor.
Stream<T> gibi generic veya IntStream, LongStream gibi generic olmayan bir sürü arayüz geliyor.
Bu arayüzler arasında allMatch(), anyMatch(), collect(), concat(), count() gibi ortak metodlar var.

Stream Arayüzü
Stream arayüzünü metodlardan dönmek yerine collect metodu ile elde edilen listeyi dönmek çok daha iyi. Örnekte Stream dönen bir metod var
Stream<T> deriveSomethingMeaningfulFromPrivateState() {
    return myPrivateThingies.stream()
        .map(this::ownerOfthing)
        .map(Owner::socialStatus)
        .filter(SocialStatus::isHeAFineMatey);
        // No collect
}
Bence Stream yerine Collection dönen bir metod daha iyi anlaşılır.
ImmutableSet<T> deriveSomethingMeaningfulFromPrivateState() {
    return myPrivateThingies.stream()
        .map(this::ownerOfThing)
        .map(Owner::socialStatus)
        .filter(SocialStatus::isHeAFineMatey)
        .collect(MyCustomCollectors.toImmutableSet());
}
anyMatch
Bu metod C#'taki Enumerable.Any ile aynı işlevi yerine getiriyor.
if (Stream.of(">", "<", "&", "l", "p").anyMatch(string::contains)) {
  ...
}

collect metodu
collect() metodu içine bir collector alır. Collector stream içindeki elemanlara bir işlem uygular. Stream sınıfları ile bir çok collector geliyor.

List'e şöyle çevrilir.
theIntStream.collect(Collectors.toList())
Map'e şöyle çevrilir.
Map<String, String> map =
    orders.stream ()
          .collect (Collectors.toMap (SomeOrder::getID,SomeOrder::getSummary));

Örnek'te string'leri birleştiren Collectors.joining() görülebilir.
Arrays.stream(s.split(Pattern.quote("||")))
   .distinct()
   .filter(st -> !st.isEmpty()) 
   .collect(Collectors.joining("||"));

Örnek'te nesneleri gruplayan Collectors.groupingBy() görülebilir.
Map<String, Long> result = 
 Stream.of(text1, text2, text3 .... text10)
 .flatMap(list -> list.stream())
 .collect(Collectors.groupingBy(x -> x, Collectors.counting()));
distinct metodu
SQL'deki distinct ile aynı işlemi yapar. Birden fazla olan elemanlardan sadece bir tanesini seçer. Örnek
Arrays.stream(s.split(Pattern.quote("||")))
   .distinct();
flatMap
Java 8 Stream flatMap yazısına taşıdım.

filter metodu
Örnek:
LinkedList<User> users = new LinkedList<>();
users.add(new User(1, "User1"));
users.add(new User(2, "User2"));
users.add(new User(3, "User3"));
List<User> resultUserList = users.stream()
        .filter(user -> user.getId() == 1)
        .collect(Collectors.toList());
findFirst
Akımdaki ilk elemanı verir. Genellikle get() ile beraber kullanılır.
System.out.println(
            "Result: " +
            Stream.of(1, 2, 3)
                    .filter(i -> {
                        System.out.println(i);
                        return true;
                    })
                    .findFirst()
                    .get()
    );

foreach
Her bir eleman için bir metodu çağırır.

mapToInt Metodu
Linq'teki select gibi nesnenin dönüşmesini sağlar. Aslında IntStream nesnesi döner. Bu nesne ile normal Stream<T> sınıfında olmayan average(), sum() gibi metodları kullanabiliriz.
double average = roster
.stream()
.filter(new Predicate<Person>(){
          public boolean test(Person p){
              return p.getGender() == Person.Sex.MALE;
           }
      })
.mapToInt(Person::getAge)
.average()
.getAsDouble();

max metodu
Listedeki en büyük elemanı bulur. Örnek:
System.out.println(list.stream().max(Integer::compare).get());
System.out.println(list.stream().min(Integer::compare).get());
of metodu
Verilen diziyi stream'e çevirir. Örnek:
public static void main(final String[] args) throws Exception {   
    Stream.of(args).forEach(System.out::println);
}
Bir başka örnek
System.out.println(Stream
        .of("a", "b", "c", "d", "e", "f")
        .reduce("", (s1, s2) -> s1 + "/" + s2)
    );
peek
Sadece debug amaçlı kullanılması gerekiyormuş.

reduce
reduce identity, accumulator ve combiner isimli üç metod alır. Örnek
BinaryOperator<String> accumulator = (s1, s2) -> {
    System.out.println("joining \"" + s1 + "\" and \"" + s2 + "\"");
    return s1 + "/" + s2;
};
System.out.println(Stream
                .of("a", "b", "c", "d", "e", "f")
                .parallel()
                .reduce("", accumulator)
);
toArray
Sonucu array olarak alabilmemizi sağlar. Örnekte bir input dizisi P tipinden bir başka diziye çevriliyor.
Arrays.stream(inputArray).map(e -> e.transformToP()).toArray(P[]::new);

IntStream arayüzü
IntStream yazısına taşıdım.

Hiç yorum yok:

Yorum Gönder