年収アップ無料転職カウンセリング実施中! | 転職エージェントはマイナビエージェント

Geekroid-ギークロイド(仮)|ITエンジニアの日常をささいな情報で彩るコラム

ITエンジニアの転職

Streamの生成

以下に、Streamを生成する基本的な方法をまとめます。

オブジェクトをStreamに変換する

リスト、文字列など、クラスによっては現在のインスタンスをもとにStreamを生成できます。以下に主なものをまとめます。

Streamに変換するための主なメソッド
メソッド Streamの対象
Colletion#stream() リスト/セットなどのコレクション
Colletion#parallelStream() リスト/セットなどのコレクション(並列化)
Arrays.stream(ary) 配列
String#chars() 文字群
String#codePoints() 文字群(サロゲートペア対応)
BufferedReader#lines() 各行
Files.lines(path, charset) ファイルの各行
Random.ints(begin, end) begin~endのint型乱数

たとえば以下は、Mapの内容をStream経由で列挙する例です。Mapはstreamメソッドを持たないので、一旦、entrySetメソッドでSetに変換してからStream化します。

StreamBasic2.java

\package com.example.mynavi.streamapi;

import java.util.Map;

public class StreamBasic2 {
  public static void main(String[] args) {
    Map<String, String> data =
      Map.of("dog", "犬", "cat", "猫", "hamster", "ハムスター");

    data.entrySet().stream()
      .forEach(System.out::println);
  }
}

hamster=ハムスター
cat=猫
dog=犬
引数から生成する – ofメソッド
public <T> Stream<T> of(T… values)
T:要素の型
values:要素の値(群)

ofメソッドを利用することで、指定された値(群)から新規のStreamを生成できます。

StreamOf.java

\package com.example.mynavi.streamapi;

import java.util.stream.Stream;

public class StreamOf {
  public static void main(String[] args) {
    Stream.of("あいうえお", "かきくけこ", "さしすせそ")
      .forEach(System.out::println);
  }
}

あいうえお
かきくけこ
さしすせそ
ラムダ式の戻り値から生成する – generateメソッド
public static <T> Stream<T> generate(Supplier<? extends T> s)
T:要素の型
s:要素生成のためのラムダ式

generateメソッドを利用することで、ラムダ式の戻り値をもとにStreamを生成できます。たとえば以下は、現在日時のタイムスタンプ値をストリーム化します。

StreamGen.java

\package com.example.mynavi.streamapi;

import java.util.Date;
import java.util.stream.Stream;

public class StreamGen {
  public static void main(String[] args) {
    Stream
      .generate(() -> {
        try {
          // ダミーの休止
          Thread.sleep(300);
        } catch (InterruptedException e) { }
        return (new Date()).getTime();
      })
      .limit(10)
      .forEach(System.out::println);
  }
}

1578184354650
1578184354951
1578184355251
1578184355551
1578184355851
1578184356152
1578184356452
1578184356753
1578184357054
1578184357354

generateメソッドは無限ストリームを生成します。よって、ここではlimitメソッドで最初の10件でStreamを打ち切っています。

複数のStreamを結合する – concatメソッド
public static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b)
T:要素の型
a、b:結合するStream

concatメソッドは既存のStreamをまとめ、一つのStreamに束ねます。

StreamConcat.java

\package com.example.mynavi.streamapi;

import java.util.stream.Stream;

public class StreamConcat {
  public static void main(String[] args) {
    Stream<String> s1 = Stream.of("あいうえお", "かきくけこ");
    Stream<String> s2 = Stream.of("さしすせそ", "たちつてと");
    Stream.concat(s1, s2)
      .forEach(System.out::println);
  }
}

あいうえお
かきくけこ
さしすせそ
たちつてと
指定範囲のStreamを生成する – rangeメソッド
public static IntStream range(int start, int end)
startInclusive:開始値
endExclusive:終了値

IntStream/LongStream/DoubleStreamクラスのrangeメソッドを利用することで、start~endの範囲を持つStreamを生成できます。rangeメソッドの戻り値は、基本型(int/long/double)に対応したIntStream/LongStream/DoubleStreamです。

StreamInt.java

\package com.example.mynavi.streamapi;

import java.util.stream.IntStream;

public class StreamInt {
  public static void main(String[] args) {
    IntStream.range(5, 10)
      .forEach(System.out::println);
  }
}

5
6
7
8
9

なお、IntStream/LongStream/DoubleStreamでも、一般的なStreamと同じく、of/generateなどのメソッドを利用できます。

Stream API
Stream APIの基本
Streamの生成
Streamによる中間処理
Streamの終端処理

年収アップ無料転職カウンセリング実施中! | 転職エージェントはマイナビエージェント

Geekroid-ギークロイド(仮)|ITエンジニアの日常をささいな情報で彩るコラム

ITエンジニアの転職