English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Java 8 Die API fügt eine neue Abstraktion namens Stream hinzu, die es Ihnen ermöglicht, Daten auf eine deklarative Weise zu verarbeiten.
Stream bietet eine hochgradige Abstraktion für die Operationen und Ausdrücke von Java-Sammlungen auf eine ähnliche Weise wie SQL-Anweisungen zur Datenabfrage aus einer Datenbank.
Die Stream-API kann die Produktivität von Java-Programmierern erheblich steigern und es ihnen ermöglichen, effiziente, saubere und einfache Code zu schreiben.
Diese Stilbehandlung betrachtet den zu verarbeitenden Elementensatz als einen Strom, der durch Rohre fließt und an den Knoten der Rohre verarbeitet werden kann, z.B. gefiltert, sortiert, aggregiert usw.
元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。
+--------------------+ +------+ +------+ +---+ +-------+ Elementflüsse werden durch Zwischenoperationen (intermediate operation) in der Pipeline verarbeitet und schließlich durch die Endoperation (terminal operation) das Ergebnis der vorangegangenen Verarbeitung erhalten. +-----| stream of elements+-> |filter|+-> |sorted|+-> |map| +--------------------+ +------+ +------+ +---+ +-------+
> |collect|
Der obige Prozess wird in Java-Code wie folgt umgesetzt: List<Integer> transactionsIds = widgets.stream() -.filter(b > b.getColor() == RED) -.sorted((x,y) - > x.getWeight() y.getWeight()) .mapToInt(Widget::getWeight)
Was ist Stream?
Stream (Fluss) ist eine Elementwarteschlange aus einer Datenquelle und unterstützt Aggregationsoperationen Elementwarteschlange
Elemente sind spezifische Objekttypen, die eine Warteschlange bilden. Java speichert keine Elemente im Stream, sondern berechnet sie auf Anfrage. Datenquelle/O channel, Generator usw. als Quelle. Dies kann eine Sammlung, ein Array, ein I
Aggregationsoperationen Operationen wie SQL-Anweisungen, z.B. filter, map, reduce, find, match, sorted usw.
Unterschiedlich zu früheren Collection-Operationen, haben Stream-Operationen auch zwei grundlegende Merkmale:
Pipelining: Zwischenoperationen返回流objekt selbst. Dies ermöglicht es, mehrere Operationen zu einer Pipeline zu verbinden, wie im Stream-Style (fluent style). Dies ermöglicht die Optimierung von Operationen, wie z.B. verzögerte Ausführung (laziness) und Kurzschluss ( short-circuiting).
interne Iteration:Bisherige Sammlungsiterationen erfolgten durch Iterator oder For-Jedoch erfolgt die Iteration über die Sammlung explizit außerhalb der Sammlung, was als externe Iteration bezeichnet wird. Stream bietet eine interne Iterationsmethode, die durch das Besuchermodell (Visitor Pattern) implementiert wird.
In Java 8 In, die Sammlungs-API hat zwei Methoden, um Ströme zu generieren:
stream() − Serielle Ströme für die Sammlung erstellen.
parallelStream() − Parallele Ströme für die Sammlung erstellen.
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); List<String> filtered = strings.stream().filter(string -if (!string.isEmpty()).collect(Collectors.toList());
Stream bietet neue Methoden wie 'forEach', um jeden Datenpunkt im Stream zu durchlaufen. Der folgende Codeabschnitt verwendet forEach, um10Zufallszahlen:
Random random = new Random(); random.ints().limit(10).forEach(System.out::println);
Die Methode map wird verwendet, um jedes Element auf das entsprechende Ergebnis zu abbilden. Der folgende Codeabschnitt verwendet map, um
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5); // Erhalten Sie die Quadratzahlen List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());
Die Methode filter wird verwendet, um Elemente durch die Festlegung von Bedingungen zu filtern. Der folgende Codeabschnitt verwendet filter, um
List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); // Anzahl der leeren Strings ermitteln long count = strings.stream().filter(string -> string.isEmpty()).count();
Die Methode limit wird verwendet, um eine bestimmte Anzahl von Datenströmen zu erhalten. Der folgende Codeabschnitt verwendet limit, um 10 Daten:
Random random = new Random(); random.ints().limit(10).forEach(System.out::println);
Die sorted-Methode wird verwendet, um Ströme zu sortieren. Der folgende Codeabschnitt verwendet die sorted-Methode, um die sortierten 10 Zufallszahlen sortieren:
Random random = new Random(); random.ints().limit(10).sorted().forEach(System.out::println);
parallelStream ist eine Alternative zum parallelen Verarbeiten von Strömen. Im folgenden Beispiel verwenden wir parallelStream, um die Anzahl der leeren Strings auszugeben:
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); // Anzahl der leeren Strings ermitteln long count = strings.parallelStream().filter(string -> string.isEmpty()).count();
Es kann sehr einfach zwischen sequenzieller Ausführung und Parallelität umgeschaltet werden.
Die Klasse Collectors implementiert viele Reduktionsoperationen, z.B. die Umwandlung von Strömen in Sammlungen und die Aggregation von Elementen. Collectors können verwendet werden, um Listen oder Strings zurückzugeben:
List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); List<String> filtered = strings.stream().filter(string -if (!string.isEmpty()).collect(Collectors.toList()); System.out.println("筛选列表: " + filtered); String mergedString = strings.stream().filter(string -if (!string.isEmpty()).collect(Collectors.joining(", ")); System.out.println("合并字符串: " + mergedString);
Außerdem sind einige Sammler, die Statistiken erzeugen, sehr nützlich. Sie werden hauptsächlich für int, double, long und andere Basistypen verwendet und können ähnliche Statistiken wie folgt erzeugen.
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5); IntSummaryStatistics stats = numbers.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());
Fügen Sie folgenden Code in Java ein8Tester.java Datei:
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: "); // Berechnen Sie die Anzahl der leeren Zeichen List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); System.out.println("列表: " +strings); long count = getCountEmptyStringUsingJava7(strings); System.out.println("Anzahl der leeren Zeichen: " " + count); count = getCountLength2UsingJava7(strings); System.out.println("字符串长度为 3 的数量为: " + count); // Entfernen Sie leere Zeichenfolgen List<String> filtered = deleteEmptyStringsUsingJava7(strings); System.out.println("筛选后的列表: " + filtered); // Entfernen Sie leere Zeichenfolgen und fügen Sie sie mit Kommas zusammen String mergedString = getMergedStringUsingJava7(strings,", "); System.out.println("合并字符串: " + mergedString); List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5); // Erhalten Sie die Quadratzahlen der Liste List<Integer> squaresList = getSquares(numbers); System.out.println("Quadratzahlenliste: " " + 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); // Parallel processing 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 getCountLength2UsingJava7(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(); } }
Führen Sie den obigen Skript aus, um das Ergebnis auszugeben:
$ javac Java8Tester.java $ java Java8Tester Verwenden Sie Java 7: Liste: [abc, , bc, efg, abcd, , jkl] Anzahl der leeren Zeichen: 2 Länge der Zeichenkette: 3 Anzahl der: 3 Filterte Liste: [abc, bc, efg, abcd, jkl] Zeichenketten zusammenfügen: abc, bc, efg, abcd, jkl Quadratzahlenliste: [9, 4, 49, 25] Liste: [1, 2, 13, 4, 15, 6, 17, 8, 19] Größte Zahl in der Liste : 19 Kleinste Zahl in der Liste : 1 Summe aller Zahlen : 85 Durchschnittswert : 9 Zufallszahl: -393170844 -963842252 447036679 -1043163142 -881079698 221586850 -1101570113 576190039 -1045184578 1647841045 Verwenden Sie Java 8: Liste: [abc, , bc, efg, abcd, , jkl] Anzahl der leeren Zeichenketten: 2 Länge der Zeichenkette: 3 Anzahl der: 3 Filterte Liste: [abc, bc, efg, abcd, jkl] Zeichenketten zusammenfügen: abc, bc, efg, abcd, jkl Quadratzahlen-Liste: [9, 4, 49, 25] Liste: [1, 2, 13, 4, 15, 6, 17, 8, 19] Größte Zahl in der Liste : 19 Kleinste Zahl in der Liste : 1 Summe aller Zahlen : 85 Durchschnittswert : 9.444444444444445 Zufallszahl: -1743813696 -1301974944 -1299484995 -779981186 136544902 555792023 1243315896 1264920849 1472077135 1706423674 Anzahl der leeren Zeichenketten: 2