Java 8 Stream ApiでのmapとflatMapの操作

1854 ワード

1.はじめに
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操作を使用して年齢を抽出する.flatMapmapと異なるのは、mapが抽出属性をストリームに入れるだけであり、flatMapはまず抽出属性を比較的小さなストリームに入れ、その後、すべてのストリームを1つのストリームに統合することである.「砂を集めて塔になる」という感じです.
理解を深めるためにもう1枚の図を描きます.
4.まとめmap操作とflatMap操作に慣れると、データストリームの操作の問題を簡単に解決することができます.知識を拡張すると、Java 8にはStreamだけでなく、Optionalにもこの2つの操作が存在し、役割はそれほど悪くありません. :Felordcn
個人ブログ:https://felord.cn