Java'da Akış

Java'da Akış

Akış şu tarihte tanıtıldı: Java 8 Stream API, nesne koleksiyonlarını işlemek için kullanılır. Java'daki bir akış, istenen sonucu elde etmek için ardışık düzen oluşturulabilecek çeşitli yöntemleri destekleyen bir nesneler dizisidir. 

Java'da Stream Kullanımı

Stream'in Java'daki kullanımları aşağıda belirtilmiştir:

  • Stream API, nesne koleksiyonlarını ifade etmenin ve işlemenin bir yoludur.
  • Filtreleme, haritalama, azaltma, sıralama gibi işlemleri yapabilmemizi sağlayın.

Java Akışı Nasıl Oluşturulur

Java Stream Oluşturma, Java Stream'in işlevlerini dikkate almadan önce atılması gereken en temel adımlardan biridir. Aşağıda bir Java Akışı bildirmek için verilen sözdizimi verilmiştir.

Sözdizimi

Aktarım aktarım;

Burada T, bildirime bağlı olarak bir sınıf nesnesi veya veri türüdür.

Java Akışı Özellikleri

Java akışlarının özellikleri aşağıda belirtilmiştir:

  • Akış bir veri yapısı değildir; yalnızca Koleksiyon Dizilerinden veya G/Ç kanallarından girdi alır.
  • Akışlar orijinal verileri değiştirmez; sadece kendi yöntemlerini kullanarak sonuç üretirler.
  • Ara işlemler (filtre haritası vb. gibi) tembeldir ve başka bir Akış döndürür, böylece bunları birbirine zincirleyebilirsiniz.
  • Bir terminal işlemi (Her sayım için toplama gibi) akışı sonlandırır ve nihai sonucu verir.

Akışlarda Farklı İşlemler

Akışlarda iki tür İşlem vardır:

  1. Ara İşlemler
  2. Terminal Operasyonları

Ara İşlemler

Java Akışı İşlemleri

Ara İşlemler, birden fazla yöntemin arka arkaya zincirlendiği işlem türleridir.

Ara İşlemlerin Özellikleri

  • Yöntemler birbirine zincirlenmiştir.
  • Ara işlemler bir akışı başka bir akışa dönüştürür.
  • Bir yöntemin verileri filtrelediği ve işlendikten sonra başka bir yönteme aktardığı filtreleme kavramını sağlar.

Önemli Ara Operasyonlar

Aşağıda belirtilen birkaç Ara Operasyon vardır:

1. harita() : Harita yöntemi, verilen fonksiyonun bu akışın elemanlarına uygulanmasının sonuçlarından oluşan bir akışı döndürmek için kullanılır.

Sözdizimi:

Aktarım harita(İşlev haritacı)

2. filtre() : Filtre yöntemi, bağımsız değişken olarak iletilen Yükleme göre öğeleri seçmek için kullanılır.

Sözdizimi:

Aktarım filtre(Yüklem yüklem)

3. sıralanmış() : Sıralanmış yöntem akışı sıralamak için kullanılır.

Sözdizimi:

Aktarım sıralanmış()
Aktarım sıralanmış(Karşılaştırıcı karşılaştırıcı)

4. düz Harita(): Java Streams'teki flatMap işlemi, bir koleksiyon akışını tek bir öğe akışına düzleştirmek için kullanılır.

Sözdizimi:

Aktarım flatMap(İşlev > haritalayıcı)

5. farklı() : Yinelenen öğeleri kaldırır. Farklı öğelerden oluşan bir akış döndürür (Object.equals(Object)'e göre).

Sözdizimi:

Aktarım belirgin()

6. göz at() : Akışı değiştirmeden her öğe üzerinde bir eylem gerçekleştirir. Bu akışın öğelerinden oluşan bir akışı döndürür, ayrıca elde edilen akıştan öğeler tüketildikçe her öğe üzerinde sağlanan eylemi gerçekleştirir.

Sözdizimi:

Aktarım göz at(Tüketici aksiyon)

Tüm ara işlemlerin kullanımını gösteren Java programı:

Java
   import     java.util.Arrays  ;   import     java.util.HashSet  ;   import     java.util.List  ;   import     java.util.Set  ;   import     java.util.stream.Collectors  ;   public     class   StreamIntermediateOperationsExample     {      public     static     void     main  (  String  []     args  )     {      // List of lists of names      List   <  List   <  String  >>     listOfLists     =     Arrays  .  asList  (      Arrays  .  asList  (  'Reflection'       'Collection'       'Stream'  )      Arrays  .  asList  (  'Structure'       'State'       'Flow'  )      Arrays  .  asList  (  'Sorting'       'Mapping'       'Reduction'       'Stream'  )      );      // Create a set to hold intermediate results      Set   <  String  >     intermediateResults     =     new     HashSet   <>  ();      // Stream pipeline demonstrating various intermediate operations      List   <  String  >     result     =     listOfLists  .  stream  ()      .  flatMap  (  List  ::  stream  )         .  filter  (  s     ->     s  .  startsWith  (  'S'  ))         .  map  (  String  ::  toUpperCase  )         .  distinct  ()         .  sorted  ()         .  peek  (  s     ->     intermediateResults  .  add  (  s  ))      .  collect  (  Collectors  .  toList  ());         // Print the intermediate results      System  .  out  .  println  (  'Intermediate Results:'  );      intermediateResults  .  forEach  (  System  .  out  ::  println  );      // Print the final result      System  .  out  .  println  (  'Final Result:'  );      result  .  forEach  (  System  .  out  ::  println  );      }   }   

Çıkış
Intermediate Results: STRUCTURE STREAM STATE SORTING Final Result: SORTING STATE STREAM STRUCTURE  

Açıklama:

  • listOfLists, diğer dize listelerini içeren bir liste olarak oluşturulur.
  • flatMap(Liste::akış): İç içe geçmiş listeleri tek bir dize akışı halinde düzleştirir.
  • filtre(ler) -> s.startsWith('S')) : Dizeleri yalnızca 'S' ile başlayanları içerecek şekilde filtreler.
  • harita(String::toUpperCase) : Akıştaki her dizeyi büyük harfe dönüştürür.
  • belirgin() : Yinelenen dizeleri kaldırır.
  • sıralanmış() : Ortaya çıkan dizeleri alfabetik olarak sıralar.
  • göz at(...): İşlenen her öğeyi ara inceleme için ara Sonuçlar kümesine ekler.
  • toplamak(Collectors.toList()): Son işlenen dizeleri sonuç adı verilen bir listede toplar.

Program, araSonuçlar kümesinde saklanan ara sonuçları yazdırır. Son olarak, tüm akış işlemlerinden sonra tamamen işlenmiş dizeleri içeren sonuç listesini yazdırır.

Terminal Operasyonları

Terminal İşlemleri, sonucu döndüren İşlem türüdür. Bu İşlemler daha fazla işlenmez, yalnızca nihai sonuç değerini döndürür.

Önemli Terminal Operasyonları

1.topla() : Collect yöntemi, akış üzerinde gerçekleştirilen ara işlemlerin sonucunu döndürmek için kullanılır.

Sözdizimi:

R topla(Toplayıcı kolektör)

2. Her biri için() : forEach yöntemi, akışın her öğesi boyunca yineleme yapmak için kullanılır.

Sözdizimi:

void forEach(Tüketici aksiyon)

3. azalt(): Reduce yöntemi bir akışın elemanlarını tek bir değere indirgemek için kullanılır. Reduce yöntemi parametre olarak BinaryOperator'ı alır.

Sözdizimi:

T azalt(T kimliği İkiliİşleç akümülatör)
İsteğe bağlı azalt(İkiliİşleç akümülatör)

4. sayım() : Akıştaki öğelerin sayısını döndürür.

Sözdizimi:

uzun sayım()

5.FindFirst() : Varsa akışın ilk öğesini döndürür.

Sözdizimi:

İsteğe bağlı ilk bul()

6. allMatch() : Akışın tüm öğelerinin belirli bir yüklemle eşleşip eşleşmediğini kontrol eder.

Sözdizimi:

boolean allMatch(Yüklem yüklem)

7. Herhangi bir eşleşme () : Akışın herhangi bir öğesinin belirli bir yüklemle eşleşip eşleşmediğini kontrol eder.

Sözdizimi:

Boolean Anymatch (Yüküm) yüklem)

Burada bir değişkene başlangıç ​​değeri olarak 0 atanır ve buna i eklenir.

Not: Ara İşlemler, bir sonraki yönteme geçmeden önce her yöntemin sabit bir değer (Terminal işlemi) döndürmesini sağlayan Tembel Değerlendirme konseptine dayalı olarak çalışır.

Tüm Terminal İşlemlerini Kullanan Java Programı:

Java
   import     java.util.*  ;   import     java.util.stream.Collectors  ;   public     class   StreamTerminalOperationsExample     {      public     static     void     main  (  String  []     args  )     {      // Sample data      List   <  String  >     names     =     Arrays  .  asList  (      'Reflection'       'Collection'       'Stream'        'Structure'       'Sorting'       'State'      );      // forEach: Print each name      System  .  out  .  println  (  'forEach:'  );      names  .  stream  ().  forEach  (  System  .  out  ::  println  );      // collect: Collect names starting with 'S' into a list      List   <  String  >     sNames     =     names  .  stream  ()      .  filter  (  name     ->     name  .  startsWith  (  'S'  ))      .  collect  (  Collectors  .  toList  ());      System  .  out  .  println  (  'ncollect (names starting with 'S'):'  );      sNames  .  forEach  (  System  .  out  ::  println  );      // reduce: Concatenate all names into a single string      String     concatenatedNames     =     names  .  stream  ().  reduce  (      ''        (  partialString       element  )     ->     partialString     +     ' '     +     element      );      System  .  out  .  println  (  'nreduce (concatenated names):'  );      System  .  out  .  println  (  concatenatedNames  .  trim  ());      // count: Count the number of names      long     count     =     names  .  stream  ().  count  ();      System  .  out  .  println  (  'ncount:'  );      System  .  out  .  println  (  count  );      // findFirst: Find the first name      Optional   <  String  >     firstName     =     names  .  stream  ().  findFirst  ();      System  .  out  .  println  (  'nfindFirst:'  );      firstName  .  ifPresent  (  System  .  out  ::  println  );      // allMatch: Check if all names start with 'S'      boolean     allStartWithS     =     names  .  stream  ().  allMatch  (      name     ->     name  .  startsWith  (  'S'  )      );      System  .  out  .  println  (  'nallMatch (all start with 'S'):'  );      System  .  out  .  println  (  allStartWithS  );      // anyMatch: Check if any name starts with 'S'      boolean     anyStartWithS     =     names  .  stream  ().  anyMatch  (      name     ->     name  .  startsWith  (  'S'  )      );      System  .  out  .  println  (  'nanyMatch (any start with 'S'):'  );      System  .  out  .  println  (  anyStartWithS  );      }   }   

Çıkış:

AkışlarÇıktıÇıkış

Açıklama:

  • Ad listesi örnek dizelerle oluşturulur.
  • Her biri için: Listedeki her adı yazdırır.
  • TOPLAMAK : 'S' ile başlayan adları filtreler ve yeni bir listede toplar.
  • azaltmak : Tüm adları tek bir dizede birleştirir.
  • saymak : Toplam ad sayısını sayar.
  • İlk Bul : Listedeki ilk adı bulur ve yazdırır.
  • hepsiEşleşme : Tüm adların 'S' ile başlayıp başlamadığını kontrol eder.
  • şanssız : Herhangi bir ismin 'S' ile başlayıp başlamadığını kontrol eder.

Program, her ismin 'S' ile başlayan adlarını birleştirilmiş adları ad sayısını, ilk adı tüm adların 'S' ile başlayıp başlamadığını ve herhangi bir adın 'S' ile başlayıp başlamadığını yazdırır.

Java Stream'in Faydaları

Aşağıda belirtildiği gibi Java'da Stream kullanmamızın bazı avantajları vardır:

  • Depolama Yok
  • Fonksiyonların Boru Hattı
  • Tembellik
  • Sonsuz olabilir
  • Paralelleştirilebilir
  • Stream IntStream vb.'deki koleksiyon dizilerinden Dosyalar Satır Yöntemleri oluşturulabilir.

Java Akışlarının Gerçek Dünyadaki Kullanım Durumları

Akışlar, modern Java uygulamalarında aşağıdaki amaçlarla yaygın olarak kullanılır:

  • Veri İşleme
  • JSON/XML yanıtlarını işlemek için
  • Veritabanı İşlemleri için
  • Eşzamanlı İşleme