前回の記事の続き。
Employeeオブジェクトを使ってnameの頭文字が”A”の人のsalaryを出力する処理を書いた。
では今度はsalaryが200以下の人で、かつnameの頭文字が”A”の人だけ給料を100増やしたい場合はどのように書いたら良いだろうか。
書き方としては色々あるが、今回は2パターン書いてみたいと思う。
filter()メソッドの条件に追加する
これは単純にfilter()メソッドの条件でsalaryが200以下で、nameの頭文字が”A”のEmployeeオブジェクトのみに絞り処理をする方法。
empArray.stream().filter(x -> x.getSalary() <= 200 && x.getName().startsWith("A")) .forEach(x -> x.setSalary(x.getSalary() + 100));
Employeeオブジェクトの中身が変わっているかを確認するために、empArrayの中身を出力するコードも加える。
empArray.stream().forEach(x -> System.out.println(x.getName() + " : "+ x.getSalary())); System.out.println("------------------------------------------"); empArray.stream().filter(x -> x.getSalary() <= 200 && x.getName().startsWith("A")) .forEach(x -> x.setSalary(x.getSalary() + 100)); empArray.stream().forEach(x -> System.out.println(x.getName() + " : "+ x.getSalary())); //コンパイル後実行 Anubis : 100 Atum : 300 Isis : 200 Osiris : 200 Geb : 500 ------------------------------------------ Anubis : 200 Atum : 300 Isis : 200 Osiris : 200 Geb : 500
ちゃんとAnubisのsalaryが100加算されているのが分かる。
forEach()メソッドの中で判定して加算する
この書き方はとてもナンセンスだが、こんな書き方も可能という意味で紹介する。
正直この書き方をするならfilter()メソッド使わなくて良いんじゃないか、ってなると思う。
empArray.stream().filter(x -> x.getSalary() <= 200) .forEach(x -> { boolean flg = x.getName().startsWith("A"); if(flg){ x.setSalary(x.getSalary() + 100); } });
このようにfilter()メソッドでsalaryが200以下のオブジェクトを絞って、forEach()メソッドの中でnameの頭文字が”A”かどうかの判定をして、結果をboolean型の変数flgに代入し、if文で加算するかしないかの判定を行なっている。
この書き方が出来るということはfilter()メソッドを一切利用せずforEach()メソッドのみで実現することも出来るということだが、このように冗長なコードになってしまう。
なので使い所を理解して各種Streamのメソッドを利用していくことになるが、ラムダ式の中にはいくつもの処理を書くことも出来るということを紹介したかったので例として上げてみた。
コメント