Java SteramAPIの中間操作
JavaのSteramAPI中間操作(処理)に関してまとめていきます。 各Collection系のSteramAPI操作に関してはこちらの記事に掲載済み。
目次
中間操作とは
中間操作(処理)とはStreamAPIにおいて、各Collection系のオブジェクトをSteramで流した時に様々な編集、抽出を行う操作です。 例えばListの中から特定の文字が入るもので絞る操作を行ったり、要素の変更を行ったり、ソート処理を行ったりできます。 SteramAPIの肝となる部分と言っても良いと思うので、使用頻度の高そうなものをここにまとめておきたいと思います。
filter処理
filter処理では要素を特定の条件に沿って絞ることができます。
// List型 List<String> animalList = Arrays.asList("Dog","Cat"); // Filter処理 animalList.stream().filter(a -> a.startsWith("D")) .forEach(System.out::println);
■実行結果
Dog
上記のコードではは宣言したListの中からfilter内で「Dで始まるもの」という条件で真になるものを絞った結果が出力されます。
map処理
map処理では要素を指定した値に変化させることができます。
List<String> animalList = Arrays.asList("Dog","Cat"); // Map処理 animalList.stream().map(a -> a.toUpperCase()) .forEach(System.out::println);
■実行結果
DOG CAT
上記のコードではmap内でアルファベットを大文字にする処理を行っています。
また、map処理では主にオブジェクト内の特定のフィールドを抽出するケースが多いので、そちらの例も載せておきます。
@AllArgsConstructor @Data public class Animal { String name; String type; } List<Animal> animalList = Arrays.asList( new Animal("Poti","Dog"), new Animal("Tama","Cat") ); // Map処理 animalList.stream().map(a -> a.getName()) .forEach(System.out::println);
■実行結果
Poti Tama
上記のようにすればObjectから特定のフィールドのみを取り出すことが出来ます。
sorted処理
sorted処理では要素をソートすることができます。
List<String> animalList = Arrays.asList("Dog","Cat"); // Sort処理 animalList.stream().sorted().forEach(System.out::println);
■実行結果
Cat Dog
sort処理ではオブジェクトの特定のキーを使用してソートを実行するケースが多いため、そちらも覚えておきましょう。
@AllArgsConstructor @Data public class Animal { String name; String type; } List<Animal> animalList = Arrays.asList( new Animal("Poti","Dog"), new Animal("Tama","Cat"), new Animal("Mike","Cat") ); // 第一ソートキーtype、第二ソートキーnameで昇順ソートする animalList.stream().sorted(Comparator.comparing(Animal::getType) .thenComparing(Comparator.comparing(Animal::getName))) .forEach(System.out::println);
■実行結果
StreamApiTest.Animal(name=Mike, type=Cat) StreamApiTest.Animal(name=Tama, type=Cat) StreamApiTest.Animal(name=Poti, type=Dog)
上記のコードはComparetor.comparingを使用して、第一ソートキーをAnimalクラスのtypeフィールドとし、 thenComparingを使用して第二ソートキーをnameフィールドとしています。
もし降順ソートを行う場合は.reversed()を付けてください。
// 第一ソートキーtypeの昇順、第二ソートキーnameで降順ソートする animalList.stream().sorted(Comparator.comparing(Animal::getType) .thenComparing(Comparator.comparing(Animal::getName).reversed()) .forEach(System.out::println);
■実行結果
StreamApiTest.Animal(name=Tama, type=Cat) StreamApiTest.Animal(name=Mike, type=Cat) StreamApiTest.Animal(name=Poti, type=Dog)
limit処理
limit処理では要素を指定した数で打ち切ることができます。
sort処理と組み合わせると特定の要素でソートした後に要素を絞ることが可能です。
@AllArgsConstructor @Data public class Animal { String name; String type; } List<Animal> animalList = Arrays.asList( new Animal("Poti","Dog"), new Animal("Tama","Cat"), new Animal("Mike","Cat") ); animalList.stream().sorted(Comparator.comparing(Animal::getType)) .limit(2).forEach(System.out::println);
■実行結果
StreamApiTest.Animal(name=Tama, type=Cat) StreamApiTest.Animal(name=Mike, type=Cat)
limit内には整数を入力します。
上記コードでソートした結果から上位2件が取得されたことがわかります。
中間操作を一つずつ使って覚えていく
StreanAPI従来のレガシーなJavaの書き方とは少し異なったものになるので、初めはパッと記述するのは難しいかもしれません。
最初の頃は当サイトを始め参考サイトを見ながら実際に作ってみながら徐々に覚えていくのが良いんじゃないでしょうか。
次回は終端操作に関してまとめていきます。