Java 8 - Akımlar

Akış, Java 8'de tanıtılan yeni bir soyut katmandır. Akış kullanarak, verileri SQL deyimlerine benzer şekilde bildirime dayalı bir şekilde işleyebilirsiniz. Örneğin, aşağıdaki SQL ifadesini düşünün.

SELECT max(salary), employee_id, employee_name FROM Employee

Yukarıdaki SQL ifadesi, geliştiricinin tarafında herhangi bir hesaplama yapmadan, maksimum maaşlı çalışanın ayrıntılarını otomatik olarak döndürür. Java'da koleksiyon çerçevesini kullanan bir geliştiricinin döngüler kullanması ve tekrarlanan kontroller yapması gerekir. Diğer bir endişe ise verimliliktir; çok çekirdekli işlemciler kolaylıkla temin edilebildiğinden, bir Java geliştiricisinin hataya oldukça açık olabilen paralel kod işleme yazması gerekir.

Bu tür sorunları çözmek için Java 8, geliştiricinin verileri bildirimsel olarak işlemesine ve bunun için herhangi bir özel kod yazmaya gerek kalmadan çok çekirdekli mimariden yararlanmasına olanak tanıyan akış kavramını tanıttı.

Akış nedir?

Akış, bir kaynaktan toplanan işlemleri destekleyen bir dizi nesneyi temsil eder. Bir Akışın özellikleri aşağıdadır -

  • Sequence of elements- Bir akış, sıralı bir şekilde belirli türden bir dizi öğe sağlar. Bir akış, öğeleri talep üzerine alır / hesaplar. Öğeleri asla saklamaz.

  • Source - Akış, Giriş kaynağı olarak Koleksiyonları, Dizileri veya G / Ç kaynaklarını alır.

  • Aggregate operations - Akış; filtre, eşleme, sınırlama, azaltma, bulma, eşleştirme vb. Gibi toplu işlemleri destekler.

  • Pipelining- Akış işlemlerinin çoğu, sonuçlarının ardışık düzenlenmesi için akışı kendisi döndürür. Bu işlemlere ara işlemler denir ve işlevleri girdi almak, işlemek ve çıktıyı hedefe döndürmektir. Collect () yöntemi, akışın sonunu işaretlemek için normal olarak boru hattı işleminin sonunda bulunan bir terminal işlemidir.

  • Automatic iterations - Akış işlemleri, açık yinelemenin gerekli olduğu Koleksiyonların aksine, yinelemeleri sağlanan kaynak öğeler üzerinden dahili olarak yapar.

Akış Oluşturma

Java 8 ile, Koleksiyon arayüzünün bir Akış oluşturmak için iki yöntemi vardır.

  • stream() - Koleksiyonu kaynağı olarak dikkate alan sıralı bir akış döndürür.

  • parallelStream() - Koleksiyonun kaynağı olduğunu düşünen paralel bir Akış döndürür.

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());

her biri için

Akış, akışın her bir öğesini yinelemek için yeni bir 'forEach' yöntemi sağladı. Aşağıdaki kod segmenti, forEach kullanarak 10 rastgele sayının nasıl yazdırılacağını gösterir.

Random random = new Random();
random.ints().limit(10).forEach(System.out::println);

harita

'Eşleme' yöntemi, her bir öğeyi karşılık gelen sonuca eşlemek için kullanılır. Aşağıdaki kod segmenti, haritayı kullanarak benzersiz sayı kareleri yazdırır.

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);

//get list of unique squares
List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());

filtre

'Filtre' yöntemi, bir kriter temelinde öğeleri elemek için kullanılır. Aşağıdaki kod kesimi, filtreyi kullanarak boş dizelerin bir sayısını yazdırır.

List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");

//get count of empty string
int count = strings.stream().filter(string -> string.isEmpty()).count();

limit

Akışın boyutunu azaltmak için 'limit' yöntemi kullanılır. Aşağıdaki kod bölümü, sınır kullanarak 10 rastgele sayının nasıl yazdırılacağını gösterir.

Random random = new Random();
random.ints().limit(10).forEach(System.out::println);

sıralanmış

Akışı sıralamak için 'sıralı' yöntemi kullanılır. Aşağıdaki kod segmenti, 10 rastgele sayının sıralı bir sırada nasıl yazdırılacağını gösterir.

Random random = new Random();
random.ints().limit(10).sorted().forEach(System.out::println);

Paralel İşleme

parallelStream, paralel işleme için akışın alternatifidir. ParallelStream kullanarak bir dizi boş dizeyi yazdıran aşağıdaki kod parçasına bir göz atın.

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");

//get count of empty string
long count = strings.parallelStream().filter(string -> string.isEmpty()).count();

Sıralı ve paralel akışlar arasında geçiş yapmak çok kolaydır.

Koleksiyonerler

Toplayıcılar, işlemin sonucunu bir akışın öğeleri üzerinde birleştirmek için kullanılır. Toplayıcılar, bir liste veya dizeyi döndürmek için kullanılabilir.

List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());

System.out.println("Filtered List: " + filtered);
String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));
System.out.println("Merged String: " + mergedString);

İstatistik

Java 8 ile, akış işleme yapılırken tüm istatistikleri hesaplamak için istatistik toplayıcılar tanıtılır.

List numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);

IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();

System.out.println("Highest number in List : " + stats.getMax());
System.out.println("Lowest number in List : " + stats.getMin());
System.out.println("Sum of all numbers : " + stats.getSum());
System.out.println("Average of all numbers : " + stats.getAverage());

Akış Örneği

C: \> JAVA'da seçtiğiniz herhangi bir düzenleyiciyi kullanarak aşağıdaki Java programını oluşturun.

Java8Tester.java

import java.util.ArrayList;
import java.util.Arrays;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
import java.util.Map;

public class Java8Tester {

   public static void main(String args[]) {
      System.out.println("Using Java 7: ");
		
      // Count empty strings
      List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
      System.out.println("List: " +strings);
      long count = getCountEmptyStringUsingJava7(strings);
		
      System.out.println("Empty Strings: " + count);
      count = getCountLength3UsingJava7(strings);
		
      System.out.println("Strings of length 3: " + count);
		
      //Eliminate empty string
      List<String> filtered = deleteEmptyStringsUsingJava7(strings);
      System.out.println("Filtered List: " + filtered);
		
      //Eliminate empty string and join using comma.
      String mergedString = getMergedStringUsingJava7(strings,", ");
      System.out.println("Merged String: " + mergedString);
      List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
		
      //get list of square of distinct numbers
      List<Integer> squaresList = getSquares(numbers);
      System.out.println("Squares List: " + squaresList);
      List<Integer> integers = Arrays.asList(1,2,13,4,15,6,17,8,19);
		
      System.out.println("List: " +integers);
      System.out.println("Highest number in List : " + getMax(integers));
      System.out.println("Lowest number in List : " + getMin(integers));
      System.out.println("Sum of all numbers : " + getSum(integers));
      System.out.println("Average of all numbers : " + getAverage(integers));
      System.out.println("Random Numbers: ");
		
      //print ten random numbers
      Random random = new Random();
		
      for(int i = 0; i < 10; i++) {
         System.out.println(random.nextInt());
      }
		
      System.out.println("Using Java 8: ");
      System.out.println("List: " +strings);
		
      count = strings.stream().filter(string->string.isEmpty()).count();
      System.out.println("Empty Strings: " + count);
		
      count = strings.stream().filter(string -> string.length() == 3).count();
      System.out.println("Strings of length 3: " + count);
		
      filtered = strings.stream().filter(string ->!string.isEmpty()).collect(Collectors.toList());
      System.out.println("Filtered List: " + filtered);
		
      mergedString = strings.stream().filter(string ->!string.isEmpty()).collect(Collectors.joining(", "));
      System.out.println("Merged String: " + mergedString);
		
      squaresList = numbers.stream().map( i ->i*i).distinct().collect(Collectors.toList());
      System.out.println("Squares List: " + squaresList);
      System.out.println("List: " +integers);
		
      IntSummaryStatistics stats = integers.stream().mapToInt((x) ->x).summaryStatistics();
		
      System.out.println("Highest number in List : " + stats.getMax());
      System.out.println("Lowest number in List : " + stats.getMin());
      System.out.println("Sum of all numbers : " + stats.getSum());
      System.out.println("Average of all numbers : " + stats.getAverage());
      System.out.println("Random Numbers: ");
		
      random.ints().limit(10).sorted().forEach(System.out::println);
		
      //parallel processing
      count = strings.parallelStream().filter(string -> string.isEmpty()).count();
      System.out.println("Empty Strings: " + count);
   }
	
   private static int getCountEmptyStringUsingJava7(List<String> strings) {
      int count = 0;

      for(String string: strings) {
		
         if(string.isEmpty()) {
            count++;
         }
      }
      return count;
   }
	
   private static int getCountLength3UsingJava7(List<String> strings) {
      int count = 0;
		
      for(String string: strings) {
		
         if(string.length() == 3) {
            count++;
         }
      }
      return count;
   }
	
   private static List<String> deleteEmptyStringsUsingJava7(List<String> strings) {
      List<String> filteredList = new ArrayList<String>();
		
      for(String string: strings) {
		
         if(!string.isEmpty()) {
             filteredList.add(string);
         }
      }
      return filteredList;
   }
	
   private static String getMergedStringUsingJava7(List<String> strings, String separator) {
      StringBuilder stringBuilder = new StringBuilder();
		
      for(String string: strings) {
		
         if(!string.isEmpty()) {
            stringBuilder.append(string);
            stringBuilder.append(separator);
         }
      }
      String mergedString = stringBuilder.toString();
      return mergedString.substring(0, mergedString.length()-2);
   }
	
   private static List<Integer> getSquares(List<Integer> numbers) {
      List<Integer> squaresList = new ArrayList<Integer>();
		
      for(Integer number: numbers) {
         Integer square = new Integer(number.intValue() * number.intValue());
			
         if(!squaresList.contains(square)) {
            squaresList.add(square);
         }
      }
      return squaresList;
   }
	
   private static int getMax(List<Integer> numbers) {
      int max = numbers.get(0);
		
      for(int i = 1;i < numbers.size();i++) {
		
         Integer number = numbers.get(i);
			
         if(number.intValue() > max) {
            max = number.intValue();
         }
      }
      return max;
   }
	
   private static int getMin(List<Integer> numbers) {
      int min = numbers.get(0);
		
      for(int i= 1;i < numbers.size();i++) {
         Integer number = numbers.get(i);
		
         if(number.intValue() < min) {
            min = number.intValue();
         }
      }
      return min;
   }
	
   private static int getSum(List numbers) {
      int sum = (int)(numbers.get(0));
		
      for(int i = 1;i < numbers.size();i++) {
         sum += (int)numbers.get(i);
      }
      return sum;
   }
	
   private static int getAverage(List<Integer> numbers) {
      return getSum(numbers) / numbers.size();
   }
}

Sonucu Doğrulayın

Kullanarak sınıfı derleyin javac aşağıdaki gibi derleyici -

C:\JAVA>javac Java8Tester.java

Şimdi Java8Tester'i aşağıdaki gibi çalıştırın -

C:\JAVA>java Java8Tester

Aşağıdaki sonucu vermelidir -

Using Java 7:
List: [abc, , bc, efg, abcd, , jkl]
Empty Strings: 2
Strings of length 3: 3
Filtered List: [abc, bc, efg, abcd, jkl]
Merged String: abc, bc, efg, abcd, jkl
Squares List: [9, 4, 49, 25]
List: [1, 2, 13, 4, 15, 6, 17, 8, 19]
Highest number in List : 19
Lowest number in List : 1
Sum of all numbers : 85
Average of all numbers : 9
Random Numbers:
-1279735475
903418352
-1133928044
-1571118911
628530462
18407523
-881538250
-718932165
270259229
421676854
Using Java 8:
List: [abc, , bc, efg, abcd, , jkl]
Empty Strings: 2
Strings of length 3: 3
Filtered List: [abc, bc, efg, abcd, jkl]
Merged String: abc, bc, efg, abcd, jkl
Squares List: [9, 4, 49, 25]
List: [1, 2, 13, 4, 15, 6, 17, 8, 19]
Highest number in List : 19
Lowest number in List : 1
Sum of all numbers : 85
Average of all numbers : 9.444444444444445
Random Numbers:
-1009474951
-551240647
-2484714
181614550
933444268
1227850416
1579250773
1627454872
1683033687
1798939493
Empty Strings: 2