0
0

(java gold) ストリームAPIの生成

Posted at

ストリームAPI(StreamAPI)

  • 繰り返し処理をサポートするライブラリ

  • コレクション、配列、ファイルなどのデータの集合(データソース)から要素を取り出し処理の流れ(Stream)に引き渡す。

  • 中間処理 : 戻り値はStream

  • 終端処理 : 終端処理のタイミングでうとりーむ一連の処理が実行される

  • メソッドチェーン : ストリーム生成から中間処理/終端演算子.演算子で連結できる

リスト・マップ

//リスト
    var list = new ArrayList<String>(
        Arrays.asList("ant", "elephant", "hamster"));
            list.stream()
                .forEach(System.out::println);
    // 並列処理
    list.parallelStream().forEach(System.out::println);

//マップ
    var map = new HashMap<String, String>(
            Map.of("orange", "みかん", "apple", "りんご", "strawberry", "いちご"));
            map.entrySet()
                .stream()
                .forEach(System.out::println);

Arraysクラスのstreamメソッド

int[] numbers = {1, 2, 3, 4, 5};

Arrays.stream(numbers)
    .filter(n -> n % 2 == 0) // 偶数をフィルタリング
    .map(n -> n * n) // 要素を自乗する
    .forEach(System.out::println); // 出力: 4, 16

①:numbers配列をstream()メソッドでストリームに変換
②:続けてfilter()[predicate]メソッドで偶数をフィルタリング
③:map()[Function]メソッドで要素を自乗
④:forEach()[Consumer]メソッドを使用して、処理結果を出力

プリミティブ型の配列(Int、long、doubleなど)を扱う場合、Stream型(参照型)ではなくプリミティブ型の戻り値を戻すため注意する。

引数/ラムダ式

  • ofメソッド
 var stream = Stream.of("first", "second", "third");
    stream.forEach(System.out::println); //first, second, third
  • generareメソッド
    • 指定されたラムダ式(Supplier)の戻り値でストリーム生成
      • ex: 1~100の乱数を生成、ストリーム化
      • 無限にストリーム生成するので中間/終端処理で明示的に中断
      • 以下の例ではlimit(10)で先頭10件のみ処理している
    var stream = Stream.generate(() -> {
      var r = new Random();
      return r.nextInt(100);
    });
    
    stream.limit(10)
          .forEach(System.out::println);
          
    //46 24 42 80 61 67 69 22 85 1
  • iterateメソッド
    • 指定された初期値とラムダ式(UnaryOperator)でストリーム生成
      • 第一引数に初期値、第二引数に直前の結果を渡す
    var stream = Stream.iterate(1, (num) -> {
      return num * 2;
    });
    
    stream.limit(10)
          .forEach(System.out::println);
          
    // 1 2 4 8 16 32 64 128 256 512
  • builderメソッド
    • ストリームを組み立てるためのStream.Builderオブジェクト生成
    var stream1 = Stream.of("Munchkin", "Siamese", "Persian");
    var stream2 = Stream.of("Corgi", "Poodle", "Shiba");
    Stream.concat(stream1, stream2).forEach(System.out::println);
    // Munchkin Siamese Persian 
    // Corgi Poodle Shiba
  • concatメソッド
    • 複数のストリームを結合し1つのストリームにまとめる
    var stream1 = Stream.of("Munchkin", "Siamese", "Persian");
    var stream2 = Stream.of("Corgi", "Poodle", "Shiba");
    Stream.concat(stream1, stream2).forEach(System.out::println);
    // Munchkin Siamese Persian 
    // Corgi Poodle Shiba
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0