前回の記事ではStreamのforEach()メソッドにラムダ式を渡してリストの処理をする方法について記した。
この記事ではさらにStreamを使うことでどんなことができるかを紹介していこうと思う。
filter()メソッド
このメソッドはメソッド名からも分かるように、Listの中身にフィルターをかけて処理をする。
引数にはラムダ式で除外する条件を渡して利用する。
今回は要素として1~10の数字を保持したListと、6個の文字列を保持したListを作成して利用していこうと思う。
Integer[] intArray = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
List<Integer> integer_array = Arrays.asList(intArray);
String[] strArray = {"A100", "A200", "B100","C100", "A300", "C200"};
List<String> str_array = Arrays.asList(strArray);
integer_arrayの中から偶数の数字だけ抜き出したい場合はどのように書くかというと
integer_array.stream().filter(x -> x % 2 == 0).forEach(x -> System.out.println(x));
//コンパイル後実行
2
4
6
8
10
このようになる。
偶数のみのStreamを取得したい場合はforEach()メソッドは呼び出す必要はない。
今回は実行結果を出力するために、forEach()で出力処理を加えた。
では今度はString型の文字列を扱ってみよう。
{“A100”, “A200”, “B100″,”C100”, “A300”, “C200”}
これらの要素の中から頭文字が”A”のものだけを取り出したい場合は
str_array.stream().filter(x -> x.substring(0, 1).equals("A"))
.forEach(x -> System.out.println(x));
//コンパイル後実行
A100
A200
A300
こんな感じになる。
substring()メソッドで一文字抜き出してequals()メソッドで”A”と一致するかで判定しているが、もっとシンプルにstartsWith()メソッドを利用して
str_array.stream().filter(x -> x.startsWith("A")).
forEach(x -> System.out.println(x));
//コンパイル後実行
A100
A200
A300
このように書いても結果は同じになる。
DTOなどのBeanでの利用
これらはもちろんオブジェクトに対しても利用することができる。
Employeeという名前と給料を格納するBeanを作る。
class Employee{
private String name_;
private long salary_;
Employee(String name, long salary){
this.name_ = name;
this.salary_ = salary;
}
public String getName(){
return this.name_;
}
public long getSalary(){
return this.salary_;
}
public void setName(String name){
this.name_ = name;
}
public void setSalary(long salary){
this.salary_ = salary;
}
}
メインメソッドの中で5人ぶんのオブジェクトを生成して値を格納する。
List<Employee> empArray = new ArrayList<>();
empArray.add(new Employee("Anubis", 100));
empArray.add(new Employee("Atum", 300));
empArray.add(new Employee("Isis", 200));
empArray.add(new Employee("Osiris", 200));
empArray.add(new Employee("Geb", 500));
この中から頭文字がAの人の名前と給料が知りたい、となった場合は
empArray.stream().filter(x -> x.getName().startsWith("A")).
forEach(x -> System.out.println
(x.getName() + "さんの給料は" + x.getSalary() + "ドルです。"));
//コンパイル後実行
Anubisさんの給料は100ドルです。
Atumさんの給料は300ドルです
こんな使い方もできる。
次回はこの続きから。
コメント