-
Bug
-
Resolution: Won't Fix
-
P4
-
None
-
11, 16, 17
ADDITIONAL SYSTEM INFORMATION :
Microsoft Windows 10 Pro 10.0.19042
A DESCRIPTION OF THE PROBLEM :
Nesting a `flatMap` call inside another `flatMap` produces a complete stream buffering as the one described at https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8075939
The inner Stream seems to be completely evaluated, making it impossible to use Streams comfortably in some lazy-evaluated applications (cartesian product, for instance) that would seem natural given the API.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Execute a `flatMap` operation nested in another `flatMap` operation.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
a
ax
axx
axxx
axxxx
ACTUAL -
OutOfMemoryException as sd::repeat is evaluated from start to finish filling the heap with repetitions of the string "x".
---------- BEGIN SOURCE ----------
public static void main(String[] args) {
var max = Integer.MAX_VALUE;
Stream.of("a", "b", "c")
.flatMap(s -> Stream.of("x", "y")
.flatMap(sd -> IntStream.rangeClosed(0, max)
.mapToObj(sd::repeat)))
.map(s -> s + "u")
.limit(5)
.forEach(System.out::println);
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
None found using the Streams API.
FREQUENCY : always
Microsoft Windows 10 Pro 10.0.19042
A DESCRIPTION OF THE PROBLEM :
Nesting a `flatMap` call inside another `flatMap` produces a complete stream buffering as the one described at https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8075939
The inner Stream seems to be completely evaluated, making it impossible to use Streams comfortably in some lazy-evaluated applications (cartesian product, for instance) that would seem natural given the API.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Execute a `flatMap` operation nested in another `flatMap` operation.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
a
ax
axx
axxx
axxxx
ACTUAL -
OutOfMemoryException as sd::repeat is evaluated from start to finish filling the heap with repetitions of the string "x".
---------- BEGIN SOURCE ----------
public static void main(String[] args) {
var max = Integer.MAX_VALUE;
Stream.of("a", "b", "c")
.flatMap(s -> Stream.of("x", "y")
.flatMap(sd -> IntStream.rangeClosed(0, max)
.mapToObj(sd::repeat)))
.map(s -> s + "u")
.limit(5)
.forEach(System.out::println);
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
None found using the Streams API.
FREQUENCY : always
- relates to
-
JDK-8268483 Guidance on stream limitations in laziness and termination
-
- Open
-
-
JDK-8075939 Stream.flatMap() causes breaking of short-circuiting of terminal operations
-
- Resolved
-
-
JDK-8267359 Stream.flatMap() consumes entire flatmapped stream when Stream.iterator() is called
-
- Closed
-