Going back to the original question, I think there *is* a valid use case for using Streams here, rather than Lists, or writing a recursive method. Unlike Lists (or any Collection), a Stream need not contain all elements in memory at once. This can be important for large solutions - e.g. for 30 different elements, there are over a trillion possible combinations. You don't want to try to save those all in memory. Also, streams give you access to extensive additional capabilities, including making things faster with concurrency by simply adding .parallel() to the call.
Here's a way to answer the question as originally asked:
The key part of returning a new Stream is accomplished by:
Note that an earlier version of the code did this instead:
However this was undesirable; it had the effect of recursively creating all the nested streams at once when the stream is first created - leading to excessive memory use. Better to use Suppliers and flatMap to defer the creation of each stream until the code is ready to actually use it.