エンジニアの知恵袋

エンジニアの知恵袋

フリーランスシステムエンジニアをしています。日々感じたことや学んだことをアウトプットしていきます。

Java SteramAPIの中間操作

JavaのSteramAPI中間操作(処理)に関してまとめていきます。 各Collection系のSteramAPI操作に関してはこちらの記事に掲載済み。

engineer-wisdom.hatenablog.jp

目次

  1. 中間操作とは
  2. filter処理
  3. map処理
  4. sorted処理
  5. limit処理

中間操作とは

中間操作(処理)とは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の書き方とは少し異なったものになるので、初めはパッと記述するのは難しいかもしれません。
最初の頃は当サイトを始め参考サイトを見ながら実際に作ってみながら徐々に覚えていくのが良いんじゃないでしょうか。
次回は終端操作に関してまとめていきます。