この号の前に書いた記事で、Java Stream パイプライン フローには Java が使用されていることを紹介したことがあります。コレクションクラス要素の処理を簡略化するための API。使用プロセスは 3 つの段階に分かれています。この記事を始める前に、図に示すように、これら 3 つのステージを新しい友達に紹介する必要があると思います。
#最初のステージ(図青): コレクション、配列、または行テキスト ファイルを Java Stream パイプライン ストリームに変換します
第 2 段階 (図の点線部分): パイプライン ストリーミング データ処理操作、 内のすべての要素をパイプライン処理します。前のパイプの出力要素は、次のパイプの入力要素として機能します。
第 3 段階 (図の緑色): パイプライン フローの結果処理操作。これがこの記事の中心的な内容です。
学習を開始する前に、以前に説明した例を確認する必要があります:
ListnameStrs = Arrays.asList("Monkey", "Lion", "Giraffe","Lemur"); List list = nameStrs.stream() .filter(s -> s.startsWith("L")) .map(String::toUpperCase) .sorted() .collect(toList()); System.out.println(list);
まず、stream() メソッドを使用して文字列 List For を変換します。パイプライン ストリーム Stream
を呼び出してから、パイプライン データ処理操作を実行します。まずフィルター関数を使用して、大文字の L で始まるすべての文字列をフィルターします。次に、パイプライン内の文字列を大文字の toUpperCase に変換してから、sorted 関数を呼び出します。並べ替える方法。これらの API の使用方法は、この記事の以前の記事で紹介されています。ラムダ式と関数参照も使用されます。
最後に、結果処理に収集関数を使用し、Java Stream パイプライン ストリームをリストに変換します。リストの最終出力は次のとおりです:[LEMUR, LION]
Java Stream パイプライン フローを使用しない場合は、上記の関数を完了するために必要なコード行の数を検討してください。 ?話題に戻りますが、この記事では第 3 段階、つまりパイプライン ストリームの処理結果に対してどのような操作を実行できるのかについて説明します。始めましょう!
型変換を実行するのではなく、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);
Parallel() 関数は、パイプライン内の要素が逐次ではなく並列で処理されることを示し、処理速度が速くなります。ただし、これにより、パイプライン フロー内の後の要素が最初に処理され、前の要素が後で処理される可能性があり、要素の順序は保証されません。保証はありませんが、forEachOrdered メソッドは、要素が出力される順序が、要素がパイプライン ストリームに入る順序と一致していることを保証できます。つまり、次のようになります (forEach メソッドはこの順序を保証できません):
MonkeyLionGiraffe
3. 要素のコレクションcollect
Lemur
Lion
3.1. Set として収集
SetcollectToSet = Stream.of( "Monkey", "Lion", "Giraffe", "Lemur", "Lion" ) .collect(Collectors.toSet()); //最终collectToSet 中的元素是:[Monkey, Lion, Giraffe, Lemur],注意Set会去重。
3.2. List への収集
コレクターを使用して要素をList
に収集できます。
3.3. 共通の収集メソッドList<String> collectToList = Stream.of( "Monkey", "Lion", "Giraffe", "Lemur", "Lion" ).collect(Collectors.toList()); // 最终collectToList中的元素是: [Monkey, Lion, Giraffe, Lemur, Lion]
LinkedListcollectToCollection = Stream.of( "Monkey", "Lion", "Giraffe", "Lemur", "Lion" ).collect(Collectors.toCollection(LinkedList::new)); //最终collectToCollection中的元素是: [Monkey, Lion, Giraffe, Lemur, Lion]
注: LinkedList::new はコード内で使用されており、実際には LinkedList のコンストラクターを呼び出して要素をリンク リストに収集します。もちろん、
LinkedHashSet::newやPriorityQueue::new
などのメソッドを使用して、データ要素を他のコレクション型に収集することもできます。その方が汎用性が高くなります。3.4. 配列への収集
String[] toArray = Stream.of( "Monkey", "Lion", "Giraffe", "Lemur", "Lion" ) .toArray(String[]::new); //最终toArray字符串数组中的元素是: [Monkey, Lion, Giraffe, Lemur, Lion]
3.5. Map への収集
を使用して、Map キー値の一意性を確保します。
3.6. Grouping By groupingByMap<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}
Map> 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}
这是该过程的说明: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}
以上がJava Stream APIでの端末操作例を分析するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。