Running Poniższy przykładowy kod kończy się:
"Wyjątek w wątku "main" java.lang.StackOverflowError"Java 8 strumienie - stackoverflow wyjątek
import java.util.stream.IntStream;
import java.util.stream.Stream;
public class TestStream {
public static void main(String[] args) {
Stream<String> reducedStream = IntStream.range(0, 15000)
.mapToObj(Abc::new)
.reduce(
Stream.of("Test")
, (str , abc) -> abc.process(str)
, (a , b) -> {throw new IllegalStateException();}
);
System.out.println(reducedStream.findFirst().get());
}
private static class Abc {
public Abc(int id) {
}
public Stream<String> process(Stream<String> batch) {
return batch.map(this::doNothing);
}
private String doNothing(String test) {
return test;
}
}
}
Czym dokładnie jest przyczyną tego problemu? Która część tego kodu jest rekurencyjna i dlaczego?
Dlaczego redukujesz strumień do innego strumienia? – Tunaki
nie ma rekurencyjnego wywołania i działa dobrze na moim komputerze. – Andrew
Problem pochodzi z wywołań 15000 do 'map'. Wewnętrznie, musi je jakoś połączyć. Możesz go odtworzyć bez 'Abc':' IntStream.range (0, 15000) .boxed(). Reduce (Stream.of ("Test"), (str, abc) -> str.map (s -> s) , (a, b) -> {throw new IllegalStateException();} ' – Tunaki