# Stream API
### What is the Stream API? - It abstracts data to provide a common way to read and write data stored in various ways - Using the Stream API, not only arrays and Collections but also data stored in files can all be handled in the same way - It is a feature that allows stored elements of arrays, lists, and other collections to be referenced one by one and processed with lambda expressions - It is needed when implementing sorting, filtering, duplicate removal, etc. of data within a Collection
### Characteristics of Streams - Unlike collections that operate through external iteration, Streams operate through `internal iteration` - Streams are `single-use` - Unlike Collections which are reusable, once a Stream is used it is closed and cannot be reused - If needed, sorted results can be stored in a Collection or array and returned - Streams `do not modify the original data` - Streams only read data from the original data and do not modify the original data itself - Stream operations use `filter-map` based APIs to optimize performance through `lazy evaluation` - Streams support `easy parallel processing` through the `parallelStream()` method - Streams process work through internal iteration - One of the reasons Stream-based work can be concise is internal iteration - Internal iteration means that loops can be hidden inside methods - Loops are not exposed in the code
### Stream API Operation Flow 1. Creation of the Stream 2. Intermediate operations of the Stream (transformation of the Stream) 3. Terminal operations of the Stream (consumption of the Stream)