以下に、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化します。
- package com.example.mynavi.streamapi;
- import java.util.Map;
- public class StreamBasic2 {
- public static void main(String args) {
- var 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を生成できます。
- ¥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を生成できます。たとえば以下は、現在日時のタイムスタンプ値をストリーム化します。
- 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);
- }
- }<
▼
- 1736562990772
- 1736562991087
- 1736562991398
- 1736562991709
- 1736562992023
- 1736562992337
- 1736562992650
- 1736562992962
- 1736562993276
- 1736562993587
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に束ねます。
- package com.example.mynavi.streamapi;
- import java.util.stream.Stream;
- public class StreamConcat {
- public static void main(String args) {
- var s1 = Stream.of("あいうえお", "かきくけこ");
- var s2 = Stream.of("さしすせそ", "たちつてと");
- Stream.concat(s1, s2)
- .forEach(System.out::println);
- }
- }
▼
- あいうえお
- かきくけこ
- さしすせそ
- たちつてと
指定範囲のStreamを生成する – rangeメソッド
public static IntStream range(int start, int end)
start:開始値
end:終了値
IntStream/LongStream/DoubleStreamクラスのrangeメソッドを利用することで、start~endの範囲を持つStreamを生成できます。rangeメソッドの戻り値は、基本型(int/long/double)に対応したIntStream/LongStream/DoubleStreamです。
- 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などのメソッドを利用できます。
監修