Heim > Java > javaLernprogramm > Hauptteil

Analysieren Sie Beispiele für Terminaloperationen in der Java Stream API

王林
Freigeben: 2023-05-08 17:34:17
nach vorne
883 Leute haben es durchsucht

    1. Datenverarbeitungsvorgang der Java Stream-Pipeline

    In dem Artikel, den ich vor dieser Ausgabe geschrieben habe, habe ich Ihnen einmal vorgestellt, dass der Java Stream-Pipeline-Stream eine Java-API ist, die zur Vereinfachung der Verarbeitung von Sammlungsklassenelementen verwendet wird. Der Nutzungsprozess gliedert sich in drei Phasen. Bevor ich mit diesem Artikel beginne, muss ich meiner Meinung nach noch einigen neuen Freunden diese drei Phasen vorstellen, wie im Bild gezeigt:

    Analysieren Sie Beispiele für Terminaloperationen in der Java Stream API

    • Die erste Phase (im Bild blau): Sammlung, Array oder Zeile konvertieren Textdateien Die zweite Stufe des Java-Stream-Pipeline-Flusses

    • (der gestrichelte Teil in der Abbildung): Pipeline-Streaming-Datenverarbeitungsvorgang, bei dem jedes Element in der Pipeline verarbeitet wird. Die Ausgabeelemente der vorherigen Pipe dienen als Eingabeelemente für die nächste Pipe.

    • Die dritte Stufe (grün im Bild): Verarbeitungsvorgang für Pipeline-Flussergebnisse, der den Kerninhalt dieses Artikels darstellt.

    Bevor Sie mit dem Lernen beginnen, müssen Sie sich noch ein Beispiel ansehen, das wir Ihnen zuvor erklärt haben:

    List<String> nameStrs = Arrays.asList("Monkey", "Lion", "Giraffe","Lemur");
    List<String> list = nameStrs.stream()
            .filter(s -> s.startsWith("L"))
            .map(String::toUpperCase)
            .sorted()
            .collect(toList());
    System.out.println(list);
    Nach dem Login kopieren

    Verwenden Sie zuerst die Methode stream(), um die Zeichenfolge List in einen Pipeline-Stream-Stream umzuwandeln

    Führen Sie dann Pipeline-Datenverarbeitungsvorgänge aus Verwenden Sie zunächst die Filterfunktion, um alle Zeichenfolgen zu filtern, die mit dem Großbuchstaben L beginnen, konvertieren Sie dann die Zeichenfolgen in der Pipeline in Großbuchstaben in Großbuchstaben und rufen Sie dann die sortierte Methode zum Sortieren auf. Die Verwendung dieser APIs wurde in früheren Artikeln dieses Artikels vorgestellt. Es werden auch Lambda-Ausdrücke und Funktionsreferenzen verwendet.

    Verwenden Sie abschließend die Sammelfunktion für die Ergebnisverarbeitung, um den Java Stream-Pipeline-Stream in eine Liste umzuwandeln. Die endgültige Ausgabe der Liste lautet: [LEMUR, LION][LEMUR, LION]

    如果你不使用java Stream管道流的话,想一想你需要多少行代码完成上面的功能呢?回到正题,这篇文章就是要给大家介绍第三阶段:对管道流处理结果都可以做哪些操作呢?下面开始吧!

    二、ForEach和ForEachOrdered

    如果我们只是希望将Stream管道流的处理结果打印出来,而不是进行类型转换,我们就可以使用forEach()方法或forEachOrdered()方法。

    Stream.of("Monkey", "Lion", "Giraffe", "Lemur", "Lion")
            .parallel()
            .forEach(System.out::println);
    Stream.of("Monkey", "Lion", "Giraffe", "Lemur", "Lion")
            .parallel()
            .forEachOrdered(System.out::println);
    Nach dem Login kopieren

    parallel()函数表示对管道中的元素进行并行处理,而不是串行处理,这样处理速度更快。但是这样就有可能导致管道流中后面的元素先处理,前面的元素后处理,也就是元素的顺序无法保证

    forEachOrdered从名字上看就可以理解,虽然在数据处理顺序上可能无法保障,但是forEachOrdered方法可以在元素输出的顺序上保证与元素进入管道流的顺序一致。也就是下面的样子(forEach方法则无法保证这个顺序):

    Monkey
    Lion
    Giraffe
    Lemur
    Lion

    三、元素的收集collect

    java Stream 最常见的用法就是:一将集合类转换成管道流,二对管道流数据处理,三将管道流处理结果在转换成集合类。那么collect()方法就为我们提供了这样的功能:将管道流处理结果在转换成集合类。

    3.1.收集为Set

    通过Collectors.toSet()方法收集Stream的处理结果,将所有元素收集到Set集合中。

    Set<String> collectToSet = Stream.of(
       "Monkey", "Lion", "Giraffe", "Lemur", "Lion"
    ) 
    .collect(Collectors.toSet());
    //最终collectToSet 中的元素是:[Monkey, Lion, Giraffe, Lemur],注意Set会去重。
    Nach dem Login kopieren

    3.2.收集到List

    同样,可以将元素收集到List使用toList()收集器中。

    List<String> collectToList = Stream.of(
       "Monkey", "Lion", "Giraffe", "Lemur", "Lion"
    ).collect(Collectors.toList());
    
    // 最终collectToList中的元素是: [Monkey, Lion, Giraffe, Lemur, Lion]
    Nach dem Login kopieren

    3.3.通用的收集方式

    上面为大家介绍的元素收集方式,都是专用的。比如使用Collectors.toSet()收集为Set类型集合;使用Collectors.toList()收集为List类型集合。那么,有没有一种比较通用的数据元素收集方式,将数据收集为任意的Collection接口子类型。 所以,这里就像大家介绍一种通用的元素收集方式,你可以将数据元素收集到任意的Collection类型:即向所需Collection类型提供构造函数的方式。

    LinkedList<String> collectToCollection = Stream.of(
       "Monkey", "Lion", "Giraffe", "Lemur", "Lion"
    ).collect(Collectors.toCollection(LinkedList::new));
    //最终collectToCollection中的元素是: [Monkey, Lion, Giraffe, Lemur, Lion]
    Nach dem Login kopieren

    注意:代码中使用了LinkedList::new,实际是调用LinkedList的构造函数,将元素收集到Linked List。当然你还可以使用诸如LinkedHashSet::newPriorityQueue::new将数据元素收集为其他的集合类型,这样就比较通用了。

    3.4.收集到Array

    通过toArray(String[]::new)方法收集Stream的处理结果,将所有元素收集到字符串数组中。

    String[] toArray = Stream.of(
       "Monkey", "Lion", "Giraffe", "Lemur", "Lion"
    ) .toArray(String[]::new);
    //最终toArray字符串数组中的元素是: [Monkey, Lion, Giraffe, Lemur, Lion]
    Nach dem Login kopieren

    3.5.收集到Map

    使用Collectors.toMap()方法将数据元素收集到Map里面,但是出现一个问题:那就是管道中的元素是作为key,还是作为value。我们用到了一个Function.identity()方法,该方法很简单就是返回一个“ t -> t ”(输入就是输出的lambda表达式)。另外使用管道流处理函数distinct()

    Wenn Sie den Java-Stream-Pipeline-Flow nicht verwenden, überlegen Sie, wie viele Codezeilen Sie benötigen, um die obige Funktion abzuschließen? Zurück zum Thema: Dieser Artikel führt Sie in die dritte Phase ein: Welche Vorgänge können an den Verarbeitungsergebnissen des Pipeline-Streams durchgeführt werden? Fangen wir an!

    2. ForEach und ForEachOrdered

    Wenn wir nur die Verarbeitungsergebnisse der Stream-Pipeline ausdrucken möchten, anstatt eine Typkonvertierung durchzuführen, können wir die Methode forEach() oder forEachOrdered() verwenden. Die Funktion 🎜
    Map<String, Integer> toMap = Stream.of(
        "Monkey", "Lion", "Giraffe", "Lemur", "Lion"
    )
    .distinct()
    .collect(Collectors.toMap(
           Function.identity(),   //元素输入就是输出,作为key
           s -> (int) s.chars().distinct().count()// 输入元素的不同的字母个数,作为value
    ));
    // 最终toMap的结果是: {Monkey=6, Lion=4, Lemur=5, Giraffe=6}
    Nach dem Login kopieren
    🎜parallel() gibt eine parallele Verarbeitung von Elementen in der Pipeline anstelle einer seriellen Verarbeitung an, was zu einer schnelleren Verarbeitung führt. Dies kann jedoch dazu führen, dass die späteren Elemente im Pipelinefluss zuerst verarbeitet werden und die vorherigen Elemente später verarbeitet werden, d. h. die Reihenfolge der Elemente kann nicht garantiert werden🎜🎜forEachOrdered kann aus dem Namen verstanden werden, obwohl die Daten Die Verarbeitungsreihenfolge kann möglicherweise nicht garantiert werden, aber die forEachOrdered-Methode kann sicherstellen, dass die Reihenfolge, in der die Elemente ausgegeben werden, mit der Reihenfolge übereinstimmt, in der die Elemente in den Pipeline-Stream gelangen. So sieht es unten aus (die forEach-Methode kann diese Reihenfolge nicht garantieren): 🎜
    🎜Affe
    Löwe
    Giraffe
    Lemur
    Löwe🎜
    🎜Drei Elemente Die häufigste Verwendung von Collect🎜🎜Java Stream ist: Erstens die Sammlungsklasse in einen Pipeline-Stream konvertieren, zweitens die Pipeline-Stream-Daten verarbeiten und drittens das Ergebnis der Pipeline-Stream-Verarbeitung in eine Sammlungsklasse konvertieren. Dann stellt uns die Methode „collect()“ die Funktion zur Verfügung, die Verarbeitungsergebnisse des Pipeline-Streams in eine Sammlungsklasse umzuwandeln. 🎜🎜3.1. Als Set sammeln🎜🎜Sammeln Sie die Verarbeitungsergebnisse von Stream über die Methode Collectors.toSet() und sammeln Sie alle Elemente in der Set-Sammlung. 🎜
    Map<Character, List<String>> groupingByList =  Stream.of(
        "Monkey", "Lion", "Giraffe", "Lemur", "Lion"
    )
    .collect(Collectors.groupingBy(
           s -> s.charAt(0) ,  //根据元素首字母分组,相同的在一组
           // counting()        // 加上这一行代码可以实现分组统计
    ));
    // 最终groupingByList内的元素: {G=[Giraffe], L=[Lion, Lemur, Lion], M=[Monkey]}
    //如果加上counting() ,结果是:  {G=1, L=3, M=1}
    Nach dem Login kopieren
    Nach dem Login kopieren
    🎜3.2. In Liste sammeln🎜🎜Ebenso können Elemente mit dem Kollektor toList() in List gesammelt werden. 🎜
    boolean containsTwo = IntStream.of(1, 2, 3).anyMatch(i -> i == 2);
    // 判断管道中是否包含2,结果是: true
    long nrOfAnimals = Stream.of(
        "Monkey", "Lion", "Giraffe", "Lemur"
    ).count();
    // 管道中元素数据总计结果nrOfAnimals: 4
    int sum = IntStream.of(1, 2, 3).sum();
    // 管道中元素数据累加结果sum: 6
    OptionalDouble average = IntStream.of(1, 2, 3).average();
    //管道中元素数据平均值average: OptionalDouble[2.0]
    int max = IntStream.of(1, 2, 3).max().orElse(0);
    //管道中元素数据最大值max: 3
    IntSummaryStatistics statistics = IntStream.of(1, 2, 3).summaryStatistics();
    // 全面的统计结果statistics: IntSummaryStatistics{count=3, sum=6, min=1, average=2.000000, max=3}
    Nach dem Login kopieren
    Nach dem Login kopieren
    🎜3.3. Universelle Erfassungsmethoden🎜🎜Die oben vorgestellten Elementerfassungsmethoden sind alle dediziert. Verwenden Sie beispielsweise Collectors.toSet(), um eine Sammlung vom Typ „Set“ zu sammeln; verwenden Sie Collectors.toList(), um eine Sammlung vom Typ „List“ zu sammeln. Gibt es also eine allgemeinere Möglichkeit, Datenelemente zu sammeln, um Daten in einem beliebigen Collection-Schnittstellen-Subtyp zu sammeln? Daher finden Sie hier eine allgemeine Methode zum Sammeln von Elementen. Sie können Datenelemente in jedem Sammlungstyp sammeln, indem Sie einen Konstruktor für den erforderlichen Sammlungstyp bereitstellen. 🎜rrreee🎜Hinweis: LinkedList::new wird im Code verwendet, der tatsächlich den Konstruktor von LinkedList aufruft, um Elemente in der verknüpften Liste zu sammeln. Natürlich können Sie auch Methoden wie LinkedHashSet::new und PriorityQueue::new verwenden, um Datenelemente in anderen Sammlungstypen zu sammeln, was vielseitiger ist. 🎜🎜3.4. In Array sammeln🎜🎜Sammeln Sie die Verarbeitungsergebnisse des Streams über die Methode toArray(String[]::new) und sammeln Sie alle Elemente in einem String-Array. 🎜rrreee🎜3.5. In der Karte gesammelt🎜🎜 Verwenden Sie die Methode Collectors.toMap(), um Datenelemente in der Karte zu sammeln, aber es gibt ein Problem: ob die Elemente in der Pipeline als Schlüssel oder als Werte verwendet werden. Wir haben eine Function.identity()-Methode verwendet, die einfach ein „t -> t“ zurückgibt (die Eingabe ist der Lambda-Ausdruck der Ausgabe). Verwenden Sie außerdem die Pipeline-Stream-Verarbeitungsfunktion distinct(), um die Eindeutigkeit des Map-Schlüsselwerts sicherzustellen. 3.6. GroupingBy 🎜
    Map<Character, List<String>> groupingByList =  Stream.of(
        "Monkey", "Lion", "Giraffe", "Lemur", "Lion"
    )
    .collect(Collectors.groupingBy(
           s -> s.charAt(0) ,  //根据元素首字母分组,相同的在一组
           // counting()        // 加上这一行代码可以实现分组统计
    ));
    // 最终groupingByList内的元素: {G=[Giraffe], L=[Lion, Lemur, Lion], M=[Monkey]}
    //如果加上counting() ,结果是:  {G=1, L=3, M=1}
    Nach dem Login kopieren
    Nach dem Login kopieren

    这是该过程的说明:groupingBy第一个参数作为分组条件,第二个参数是子收集器。

    四、其他常用方法

    boolean containsTwo = IntStream.of(1, 2, 3).anyMatch(i -> i == 2);
    // 判断管道中是否包含2,结果是: true
    long nrOfAnimals = Stream.of(
        "Monkey", "Lion", "Giraffe", "Lemur"
    ).count();
    // 管道中元素数据总计结果nrOfAnimals: 4
    int sum = IntStream.of(1, 2, 3).sum();
    // 管道中元素数据累加结果sum: 6
    OptionalDouble average = IntStream.of(1, 2, 3).average();
    //管道中元素数据平均值average: OptionalDouble[2.0]
    int max = IntStream.of(1, 2, 3).max().orElse(0);
    //管道中元素数据最大值max: 3
    IntSummaryStatistics statistics = IntStream.of(1, 2, 3).summaryStatistics();
    // 全面的统计结果statistics: IntSummaryStatistics{count=3, sum=6, min=1, average=2.000000, max=3}
    Nach dem Login kopieren
    Nach dem Login kopieren

    Das obige ist der detaillierte Inhalt vonAnalysieren Sie Beispiele für Terminaloperationen in der Java Stream API. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Verwandte Etiketten:
    Quelle:yisu.com
    Erklärung dieser Website
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
    Beliebte Tutorials
    Mehr>
    Neueste Downloads
    Mehr>
    Web-Effekte
    Quellcode der Website
    Website-Materialien
    Frontend-Vorlage