Speaking of threads, in general, this is an extensive topic. However, I will describe why you should approve the stream APIs through Iterators.
First of all, using the stream API, we can now program at a much higher level of abstraction, just like SQL queries, i.e. we express what we want and let the library handle the rest.
Secondly, stream operations perform their iterations behind the scenes (internal iteration), which means that data processing can be performed in parallel or in a different order, which can be more optimized.
On the other hand, if you decide to explicitly iterate over your collection to perform some calculations, whether using Iterator or syntactic sugar for an iterator (extended loop), you explicitly accept the elements in the collection and process them one by one, so it is essentially serial.
Using iterators instead of the stream API also means that you have to work hard when you want to go parallel or find various ways to optimize your program.
However, it also means that you spend a lot more time on low-level details, rather than just focusing on what you want your program to do.
Also mentioned in Java-8 in the action book:
The internal iteration in the Streams library can automatically select the data presentation and parallelism implementation to match your hardware. In contrast, as soon as you choose an external iteration to write for each, then, in fact, you undertook to independently manage any parallelism. (Self-government in practice means “one fine day,” “parallelize it well” or “start a long and difficult battle including tasks and synchronized ones.”)
Java 8 needs an interface like Collection, but without iterators, ergo Stream!
In essence, with the streaming API, your life is much simpler in many ways, but what I find most useful is the fact that now you can devote more time to focusing on what you want your code to do, and at the same time, you may decide to go parallel without dealing with low-level materials.
This, of course, does not mean that you should always use streams wherever possible. Rather, it points to the advantages of using threads over iterators.
There are certain places where it would be more appropriate to use iterators rather than the stream API and vice versa. Therefore, it is wise to choose which approach you need to start processing data in collections.