【Java】Streamについて(使い方や操作に使用するメソッドについて)

Java

はじめに

今回は、javaの「Stream」メソッドについて勉強したことを記載していきたいと思います。

 

Streamとは

Streamとは、ListやMap・Setなどのコレクションに対して、様々な処理をラムダ式を使用して簡潔に記述することを可能にしたメソッドのことです。

 

定義

Streamは、ListやMap・Setのコレクションに用意されている「Stream」メソッドを呼び出す、またはStreamクラスを生成することで使用することができます。

// コレクションに用意されているメソッドの呼び出し
コレクション.Stream();

// Streamクラスの生成
Stream<String> 変数名 = コレクション.stream();
Stream<String> 変数名 = Stream.of("要素1", "要素2");

// 数値の扱い
IntStream 変数名 = コレクション.stream();
IntStream 変数名 = Stream.of("要素1", "要素2");

 

    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        // オブジェクトの扱い
        List<String> list = new ArrayList<>();
        list.add("Test");

        Stream<String> stream1 = list.stream();
        Stream<String> stream2 = Stream.of("TEST", "TEST2");

        stream1.forEach(System.out::println);
        stream2.forEach(System.out::println);

        // 数値の扱い
        IntStream stream3 = IntStream.of(1,2,3);
        stream3.forEach(System.out::println);
    }

 

Streamの操作メソッドについて

Streamを操作するメソッドには、「中間操作メソッド」と「終端操作メソッド」が用意されています。

中間操作:Streamに対して変換等の中間的な操作を加える
終末操作:Streamに対して値の取り出し等、最終的な操作を実施する

 

中間操作

メソッド 内容
filter 要素にフィルターをかける
map 要素の変換をする
mapToInt 要素をint型に変換しIntStreamを返却する
mapToDouble 要素をdouble型に変換しDoubleStreamを返却する
mapToLong 要素をlong型に変換しLongStreamを返却する
flatMap 要素の変換をする
distinct 要素の重複を排除する
sorted 要素をソートする
skip 要素を指定した数、先頭からスキップする
limit 要素を先頭から指定した数まで返却する

 

filter

    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        List<String> list = new ArrayList<>();
        list.add("TestA");
        list.add("TestB");
        list.add("TestC");

        // Bを含む文字列かでフィルター
        list = list.stream().filter(x -> x.contains("B")).toList();
        list.forEach(System.out::println);
    }

 

map

    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        List<String> list = new ArrayList<>();
        list.add("TestA");
        list.add("TestB");
        list.add("TestC");

        list.stream().map(x -> x.length()).forEach(System.out::println);

        List<String> list2 = new ArrayList<>();
        list2.add("100");
        list2.add("200");
        list2.add("300");

        IntStream stream = list2.stream().mapToInt(Integer::parseInt);
        stream.forEach(System.out::println);
    }

 

distinct

    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        List<String> list = new ArrayList<>();
        list.add("TestA");
        list.add("TestB");
        list.add("TestC");
        list.add("TestA");
        list.add("TestB");
        list.add("TestC");

        list.stream().distinct().forEach(System.out::println);
    }

 

sorted

    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        List<String> list = new ArrayList<>();
        list.add("TestA");
        list.add("TestB");
        list.add("TestC");
        list.add("TestF");
        list.add("TestD");

        // 自然順序でソート
        list.stream().sorted().forEach(System.out::println);

        List<Integer> list2 = new ArrayList<>();
        list2.add(200);
        list2.add(100);
        list2.add(500);
        list2.add(600);
        list2.add(300);

        // 昇順
        list2.stream().sorted(Comparator.naturalOrder()).forEach(System.out::println);
        // 降順
        list2.stream().sorted(Comparator.reverseOrder()).forEach(System.out::println);
    }

 

skip

    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        List<String> list = new ArrayList<>();
        list.add("TestA");
        list.add("TestB");
        list.add("TestC");
        list.add("TestD");
        list.add("TestE");

        // 1,2個目の要素をスキップする
        list.stream().skip(2).forEach(System.out::println);
    }

 

limit

    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        List<String> list = new ArrayList<>();
        list.add("TestA");
        list.add("TestB");
        list.add("TestC");
        list.add("TestD");
        list.add("TestE");

        // 1,2個目まで要素を取得する
        list.stream().limit(2).forEach(System.out::println);
    }

 

終端操作

メソッド 内容
forEach 要素を繰り返し処理する
allMatch すべての要素が条件を満たす場合true
anyMatch 要素が1つでも条件を満たす場合true
noneMatch 要素が1つでも条件を満足さない場合true
findAny Streamの結果から何か1つ返却
findFirst Streamの結果から最初の内容を返却
sum 要素を合計する
max 要素の最大値を返却する
min 要素の最小値を返却する

 

forEach

    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        List<String> list = new ArrayList<>();
        list.add("TestA");
        list.add("TestB");
        list.add("TestC");

        list.stream().forEach(System.out::println);
    }

 

Match

    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        List<String> list = new ArrayList<>();
        list.add("TestA");
        list.add("TestB");
        list.add("TestC");
        list.add("TestD");
        list.add("TestE");

        // すべて一致する場合true
        System.out.println(list.stream().allMatch(x -> x.startsWith("T")));
        // 1つても一致する場合true
        System.out.println(list.stream().anyMatch(x -> x.startsWith("T")));
        // 1つも条件を満たさない場合true
        System.out.println(list.stream().noneMatch(x -> x.startsWith("T")));
    }

 

find

    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        List<String> list = new ArrayList<>();
        list.add("TestA");
        list.add("TestB");
        list.add("TestC");
        list.add("TestD");

        System.out.println(list.stream().findAny().toString());
        System.out.println(list.stream().findFirst().toString());
    }

 

sum,min,max

    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        List<String> list2 = new ArrayList<>();
        list2.add("100");
        list2.add("200");
        list2.add("300");

        IntStream stream = list2.stream().mapToInt(Integer::parseInt);
        System.out.println(stream.sum());
        System.out.println(list2.stream().max(Comparator.naturalOrder()));
        System.out.println(list2.stream().min(Comparator.naturalOrder()));
    }

 

ドキュメント

【公式ドキュメント】
Java SE Specifications (oracle.com)

 

最後に

Javaの環境構築は、この記事を参照してみてください。
【開発環境構築】VS CodeでJavaを使用するための環境構築を実施する – SEもりのLog (selifemorizo.com)

以上、ログになります。
これからも継続していきましょう!!

Javaサーバーサイド関連
おすすめIT本
良いコード/悪いコードで学ぶ設計入門

「ITエンジニア本大賞2023」技術書部門で大賞を受賞した本です。
・コードの可読性
・普段意識したほうが良いこと
・リファクタリング考え方
等、普段のコードを設計する際に意識することが書かれています。
コードのあるべき姿に迷ったら一度読んでみると良い本です。

仕組みと使い方がわかる Docker&Kubernetesのきほんのきほん

Dockerって何?となったときに私が最初に読んだ本です。
Dockerがどんな仕組みで動いているのか、コマンドでは何を命令しているのかを理解できるように、イラストを多用して説明しています。

1冊ですべて身につくJavaScript入門講座

「ITエンジニア本大賞2024」技術書部門で大賞を受賞した本です。
私が次に読もうと思っている本なのでおすすめとして挙げておきたいと思います。

コメント

タイトルとURLをコピーしました