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=犬
- 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); } }
▼
あいうえお かきくけこ さしすせそ
- 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); } }
▼
あいうえお かきくけこ さしすせそ たちつてと
- 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などのメソッドを利用できます。