Hi David, 
You can always transform an imperative code to a stream by pushing the element 
through a consumer. 
Internally, a stream uses a push iterator (see 
Spliterator.tryAdvance(consumer)). 

As a silly example, this is a way to write fibonacci (the recursive form) with 
a stream right in the middle. 

static void fibo ( int n , IntConsumer consumer ) { 
if ( n < 2 ) { 
consumer .accept( n ); 
return ; 
} 
var result = Stream . of ( "" ) 
.mapMultiToInt(( _ , consumer2 ) -> { 
fibo ( n - 1 , consumer2 ); 
fibo ( n - 2 , consumer2 ); 
}) 
.sum(); 
consumer .accept( result ); 
} 

static void main () { 
fibo ( 7 , IO :: println ); 
} 

Here, I use mapMulti() to convert the imperative code to a Stream 
(there is no factory method on Stream that takes a consumer of consumer). 

If you also want to short-circuit, you can use a gatherer instead of mapMulti 
but short-circuiting the recursive code will require to use an exception as 
control flow (it will not be pretty). 

regards, 
Rémi 

> From: "David Alayachew" <[email protected]>
> To: "core-libs-dev" <[email protected]>
> Sent: Tuesday, November 11, 2025 4:36:29 AM
> Subject: Difficulties of recursion with Streams

> Hello [ mailto:[email protected] | @core-libs-dev ] ,

> When working with streams, I often run into situations where I have to 
> "demote"
> back to imperative code because I am trying to solve a problem best solved by
> recursion.

> Consider the common use case of cycling through permutations to find all
> permutations that satisfy some condition. With recursion, the answer is
> incredibly simple -- just grab an element from the set, then call the 
> recursive
> method with a copy of the set minus the grabbed element. Once you reach the
> empty set, you've reached your terminal condition.

> Use cases like that are not only incredibly common, but usually, 
> embarrassingly
> parallel. The example above of cycling through permutations is only a few 
> lines
> of imperative code, but I struggle to imagine how I would do this with 
> Streams.

> I guess let me start by asking -- are there any good ways currently to
> accomplish the above permutation example with Streams? And if not, should 
> there
> be?

> Thank you for your time and consideration.
> David Alayachew

Reply via email to