Java 8 Stream ApiでのmapとflatMapの操作
1854 ワード
1.はじめに
Java 8は非常に使いやすいStream APIを提供しており,操作集合が容易である.今日は、2つのStream中間動作
2.map操作
概略図:
対応する疑似コード:
3.flatMap操作
上記の例によれば、
上記の操作により、各クラスの学生集合の集合
上記の偽コードに示すように、
理解を深めるためにもう1枚の図を描きます.
4.まとめ
個人ブログ:https://felord.cn
Java 8は非常に使いやすいStream APIを提供しており,操作集合が容易である.今日は、2つのStream中間動作
map(Function super T, ? extends R> mapper)
とflatMap(Function super T, ? extends Stream extends R>> mapper)
について検討します.2.map操作
map
の動作は、ストリーム中の要素を再加工して新しいストリームを形成することである.これは開発に役立ちます.例えば、学生の集合があり、学生の年齢分布曲線を分析するために学生の年齢を抽出する必要があります.Java 8に置く前に、新しい集合を作成し、学生集合を巡ることで要素の年齢属性を消費します.今、私たちは簡単なフロー操作でこのニーズを達成しました.概略図:
対応する疑似コード:
//
List ages=studentList.stream().map(Student::getAge).collect(Collectors.toList());
3.flatMap操作
上記の例によれば、
map
の動作は非常によく理解されるべきである.では、flatMap
は何をしているのでしょうか.このように、上記の例を変更して、クラス単位であれば、すべてのクラスの下のすべての学生の年齢を抽出して、学生の年齢分布曲線を分析します.この時、私たちは上記の方法を使ってもいいですか? List> studentGroup= gradeList.stream().map(Grade::getStudents).collect(Collectors.toList());
上記の操作により、各クラスの学生集合の集合
List>
しか得られません.学生の年齢データを取得するにはネストサイクルが必要で、非常に不便です.私たちがすべての学生の集合List
に戻ることができれば便利です.間違いない!flatMap
でできます! // flatMap List map
List ages = grades.stream().flatMap(grade -> grade.getStudents().stream()).map(Student::getAge).collect(Collectors.toList());
上記の偽コードに示すように、
flatMap
を使用してすべての学生を集めます.次に、map
操作を使用して年齢を抽出する.flatMap
がmap
と異なるのは、map
が抽出属性をストリームに入れるだけであり、flatMapはまず抽出属性を比較的小さなストリームに入れ、その後、すべてのストリームを1つのストリームに統合することである.「砂を集めて塔になる」という感じです.理解を深めるためにもう1枚の図を描きます.
4.まとめ
map
操作とflatMap
操作に慣れると、データストリームの操作の問題を簡単に解決することができます.知識を拡張すると、Java 8にはStreamだけでなく、Optional
にもこの2つの操作が存在し、役割はそれほど悪くありません. :Felordcn
個人ブログ:https://felord.cn