Functional
Stream: 終端操作の後に同じStreamは使えない
toListやcountなどの終端操作を一度実行したStreamは、二回目の走査で例外になります。
SourceSingleUseStreams.java
Java 21
package examples.stream;
import java.util.stream.Stream;
public final class SingleUseStreams {
private SingleUseStreams() {}
public static long consumeThenCountAgain(Stream<String> values) {
values.toList();
return values.count();
}
}TestSingleUseStreamsTest.java
Java 21
package examples.stream;
import static org.junit.jupiter.api.Assertions.assertThrows;
import java.util.stream.Stream;
import org.junit.jupiter.api.Test;
class SingleUseStreamsTest {
@Test
void 終端操作を実行したStreamは再利用できない() {
assertThrows(
IllegalStateException.class,
() -> SingleUseStreams.consumeThenCountAgain(Stream.of("java", "junit")));
}
}01Assertion
このテストで確認できること
- 最初の終端操作はStreamを消費する
- 同じStreamで二回目の終端操作をするとIllegalStateExceptionになる
複数回の走査が必要なら、結果をListに収集するかStreamを生成するSupplierを受け取ります。
OBSERVED RESULT
expected exception: consumed Stream → IllegalStateException
actual: IllegalStateException