Java
Stream

java stream 本当によく使う中間・終端操作の備忘録1

前回の投稿でStreamの基本、中間操作→終端操作という流れまで書いた。
本当に備忘録的な感じになるが、今まで使ってきたものや使用頻度の高そうな中間・終端操作を書いていく。

まずは個人的に一番使用頻度が高いと思っている、map()とCollectors.toList()から。
例えばnameやid等をもつStaffクラスのリストがあったとする。

public class Staff {

    private String name;
    private Long id;
    private int age;
   
   
   
//getter/setter等
   
   

IDには1から連番で数字が入っている(重複なし)と仮定し、処理上の理由でIDのみを抽出したリストが欲しい場合
以下のようにmap()とCollectors.toList()を使用することで抽出することができる。

    //staffListは6要素

        List<Long> idList = staffList.stream().map(staff -> staff.getId()).collect(Collectors.toList());
        idList.stream().forEach((id) -> {
            System.out.println(id.toString());
        });

出力結果

1
2
3
4
5
6
7
8
9
10
11
12

上記で行われている処理としては、
map(staff -> staff.getId())
の部分でstaffListから取り出した1要素であるstaffを、staff.getId()に変換している。
その後、
collect(Collectors.toList())
で全要素のstaffから取り出したstaff.getId()群をリスト化。
結果として、IDのみ抽出したリストが取得出来ている。
(IntStreamを使用して12人のスタッフ君を用意してますが、IntStreamの説明についてはいずれ…今回はコードだけ載せておきます)

// IntStreamで用意した12人のスタッフ君、1ミリでもどこかで参考になれば
List<Staff> staffList = IntStream.rangeClosed(1, 12).boxed()
                .map(i -> new Staff(String.valueOf(i) + "君", Long.valueOf(i), i)).collect(Collectors.toList());

ここで使用したmap(変換)は本当に様々な所で使えるので忘れないようにしたい。

次に良く出てきそうなものとして、filterがあります。
mapは変換でしたが、filterは検索です。
ここではIDを指定してスタッフの名前を求めています。
各スタッフの名前は、IDの数字に君を付けたものを入力しました。

// 引数searchID = 1L
        Staff target = staffList.stream().filter(staff -> staff.getId() == searchID).findFirst().orElse(null);
        System.out.println(target.getName());

出力結果

1君

filter(staff -> staff.getId() == searchID)
上記のfilterメソッドで絞り出す条件を指定。

findFirst().orElse(null)
で最初に条件にfilterにマッチしたStaffを取得し、もし見つからなければnullを返却しています。

他にも色々よく使うものがあるので時間を見つけて追記していきます。