Latest web development tutorials

Java 8-Stream

Java 8 neue Funktionen Java 8 neue Funktionen


Java 8 API fügt eine neue Abstraktion genannt stream Stream, können Sie die Daten in einer deklarativen Weise zu verarbeiten.

Stream verwendet eine ähnliche SQL-Anweisungen Daten aus einer Datenbank in einer intuitiven Weise abzufragen ein höheres Maß an Abstraktion und Expression von Java gesetzt Operationen zur Verfügung zu stellen.

Stream-API kann stark Java-Programmierer Produktivität bieten, so dass Programmierer effizient, sauber, einfach Code zu schreiben.

Dieser Stil Element werden als eine Art Sammlung von Stromfluss in der Pipeline-Übertragung behandelt und können auf dem Knoten der Pipeline, wie beispielsweise Filtern, Sortieren Polymerisation verarbeitet werden.

Elemente fließen in die Rohrleitung durch eine Zwischenoperationen (Zwischenbetrieb) Verarbeitung und endlich die Ergebnisse der zuvor durch die letzte Operation verarbeitet (Terminalbetrieb).

+--------------------+       +------+   +------+   +---+   +-------+
| stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect|
+--------------------+       +------+   +------+   +---+   +-------+

Die obigen Prozesse in Java-Code:

List<Integer> transactionsIds = 
widgets.stream()
             .filter(b -> b.getColor() == RED)
             .sorted((x,y) -> x.getWeight() - y.getWeight())
             .mapToInt(Widget::getWeight)
             .sum();

Was ist ein Stream?

Element Warteschlange Strom (Strom) ist eine Unterstützung von der Datenquelle und aggregieren Operationen

  • Elemente sind bestimmte Arten von Objekten, eine Warteschlange bilden. In Java-Stream speichert keine Elemente, aber On-Demand Computing.
  • Quelle Datenfluss - Quelle. gesetzt, Arrays, I / O-Kanal, Generator und andere Generatoren werden.
  • Die Polymerisation ist ähnlich wie SQL - Anweisungen von Operationen, wie zB Filter, Karte, zu verringern, zu finden, Spiel, sortiert und so weiter.

Vorherige Sammlung arbeiten verschiedene, Stream Betrieb gibt es zwei grundlegende Merkmale:

  • Pipelining: Zwischen Betrieb wird wieder ein Stream - Objekt selbst. So dass mehrere Operationen können in eine einzige Pipeline, Stil als Strom (fließend Stil) verkettet werden. Dieser Vorgang kann als Verzögerung bei der Ausführung (Trägheit) und Kurzschluss (Kurzschluss) optimiert werden, wie z.
  • Interne Iteration: vor Sammlung Traversal durch Iterator oder For-Each Weise explizite externe Sammlung Iterierte wird diese externe Iteration genannt. Strom liefert eine interne iterative Weg durch das Besuchermuster (Besucher) Umsetzung.

Flow-Generierung

In Java 8, muss die eingestellte Schnittstelle zwei Methoden, um den Strom zu erzeugen:

  • Strom () - einen seriellen Strom für die Sammlung erstellen.

  • parallelStream () - einen parallelen Strom für die Sammlung erstellen.

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

forEach

Stream stellt ein neues Verfahren von 'forEach' durch jeden Datenstrom zu iterieren. Das folgende Codefragment verwendet forEach Ausgabe von 10 Zufallszahlen:

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

Karte

Karte Verfahren für jedes Element Abbilden des Ergebnisses entspricht, wobei das folgende Codefragment verwendet die Ausgabe der Karte, um die Anzahl von quadratischen Elementen entsprechen:

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
// 获取对应的平方数
List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());

Filter

Filterverfahren wird verwendet, um die Bedingungen zu setzen, indem Elemente herausgefiltert werden. Das folgende Codefragment verwendet Filtermethode Filter aus dem leeren String:

List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// 获取空字符串的数量
int count = strings.stream().filter(string -> string.isEmpty()).count();

Limit

limitieren Verfahren für eine spezifizierte Anzahl von Strömen zu erwerben. Das folgende Codefragment verwendet Limit Verfahren aus dem 10 Daten zu drucken:

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

sortiert

Ein Verfahren zur Konvektion Reihenfolge sortiert. Das folgende Codefragment verwendet sortierten Methoden 10 Zufallszahlen Ausgabe sortieren:

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

Parallel (parallel) Programm

parallelStream ist parallel Stream-Handler Ersatz. Wir verwenden das folgende Beispiel zur Ausgabe eine leere Zeichenkette parallelStream Nummer:

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// 获取空字符串的数量
int count = strings.parallelStream().filter(string -> string.isEmpty()).count();

Wir können einfach wechseln, um parallel und direkt laufen zu lassen.


Sammler

Collectors Klasse eine Reihe von Reduktionsoperationen, zum Beispiel implementiert, wird in die Sammlung und Aggregation von Elementen streamen. Sammler können verwendet werden, um eine Liste oder eine Zeichenfolge zurück:

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);
String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));
System.out.println("合并字符串: " + mergedString);

Statistik

Darüber hinaus produzieren einige Statistiken Sammler auch sehr nützlich. Sie werden hauptsächlich für Grundtyp int, double, lange verwendet, usw., die verwendet werden können, statistische Ergebnisse ähnlich der folgenden zu erzeugen.

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

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

System.out.println("列表中最大的数 : " + stats.getMax());
System.out.println("列表中最小的数 : " + stats.getMin());
System.out.println("所有数之和 : " + stats.getSum());
System.out.println("平均数 : " + stats.getAverage());

Stream die vollständige Instanz

Java8Tester.java den folgenden Code in die Datei ein:

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("使用 Java 7: ");
		
      // 计算空字符串
      List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
      System.out.println("列表: " +strings);
      long count = getCountEmptyStringUsingJava7(strings);
		
      System.out.println("空字符数量为: " + count);
      count = getCountLength3UsingJava7(strings);
		
      System.out.println("字符串长度为 3 的数量为: " + count);
		
      // 删除空字符串
      List<String> filtered = deleteEmptyStringsUsingJava7(strings);
      System.out.println("筛选后的列表: " + filtered);
		
      // 删除空字符串,并使用逗号把它们合并起来
      String mergedString = getMergedStringUsingJava7(strings,", ");
      System.out.println("合并字符串: " + mergedString);
      List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
		
      // 获取列表元素平方数
      List<Integer> squaresList = getSquares(numbers);
      System.out.println("平方数列表: " + squaresList);
      List<Integer> integers = Arrays.asList(1,2,13,4,15,6,17,8,19);
		
      System.out.println("列表: " +integers);
      System.out.println("列表中最大的数 : " + getMax(integers));
      System.out.println("列表中最小的数 : " + getMin(integers));
      System.out.println("所有数之和 : " + getSum(integers));
      System.out.println("平均数 : " + getAverage(integers));
      System.out.println("随机数: ");
		
      // 输出10个随机数
      Random random = new Random();
		
      for(int i=0; i < 10; i++){
         System.out.println(random.nextInt());
      }
		
      System.out.println("使用 Java 8: ");
      System.out.println("列表: " +strings);
		
      count = strings.stream().filter(string->string.isEmpty()).count();
      System.out.println("空字符串数量为: " + count);
		
      count = strings.stream().filter(string -> string.length() == 3).count();
      System.out.println("字符串长度为 3 的数量为: " + count);
		
      filtered = strings.stream().filter(string ->!string.isEmpty()).collect(Collectors.toList());
      System.out.println("筛选后的列表: " + filtered);
		
      mergedString = strings.stream().filter(string ->!string.isEmpty()).collect(Collectors.joining(", "));
      System.out.println("合并字符串: " + mergedString);
		
      squaresList = numbers.stream().map( i ->i*i).distinct().collect(Collectors.toList());
      System.out.println("Squares List: " + squaresList);
      System.out.println("列表: " +integers);
		
      IntSummaryStatistics stats = integers.stream().mapToInt((x) ->x).summaryStatistics();
		
      System.out.println("列表中最大的数 : " + stats.getMax());
      System.out.println("列表中最小的数 : " + stats.getMin());
      System.out.println("所有数之和 : " + stats.getSum());
      System.out.println("平均数 : " + stats.getAverage());
      System.out.println("随机数: ");
		
      random.ints().limit(10).sorted().forEach(System.out::println);
		
      // 并行处理
      count = strings.parallelStream().filter(string -> string.isEmpty()).count();
      System.out.println("空字符串的数量为: " + 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();
   }
}

Die Umsetzung des obigen Skripts, Ausgabe lautet:

$ javac Java8Tester.java 
$ java Java8Tester
使用 Java 7: 
列表: [abc, , bc, efg, abcd, , jkl]
空字符数量为: 2
字符串长度为 3 的数量为: 3
筛选后的列表: [abc, bc, efg, abcd, jkl]
合并字符串: abc, bc, efg, abcd, jkl
平方数列表: [9, 4, 49, 25]
列表: [1, 2, 13, 4, 15, 6, 17, 8, 19]
列表中最大的数 : 19
列表中最小的数 : 1
所有数之和 : 85
平均数 : 9
随机数: 
-393170844
-963842252
447036679
-1043163142
-881079698
221586850
-1101570113
576190039
-1045184578
1647841045
使用 Java 8: 
列表: [abc, , bc, efg, abcd, , jkl]
空字符串数量为: 2
字符串长度为 3 的数量为: 3
筛选后的列表: [abc, bc, efg, abcd, jkl]
合并字符串: abc, bc, efg, abcd, jkl
Squares List: [9, 4, 49, 25]
列表: [1, 2, 13, 4, 15, 6, 17, 8, 19]
列表中最大的数 : 19
列表中最小的数 : 1
所有数之和 : 85
平均数 : 9.444444444444445
随机数: 
-1743813696
-1301974944
-1299484995
-779981186
136544902
555792023
1243315896
1264920849
1472077135
1706423674
空字符串的数量为: 2

Java 8 neue Funktionen Java 8 neue Funktionen