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などのメソッドを利用できます。






