A Streams API foi desenvolvida sob o pacote java.util.stream. Deste modo, este disponibiliza classes e interfaces que suportam as mais variadas operações funcionais que podemos aplicar sobre os dados com o Java 8. O tipo mais importante desse pacote é a interface Stream. Dito isso, será dado início ao estudo prático sobre streams.
O primeiro passo para se trabalhar com streams é saber como criá-las A forma mais comum é através de uma coleção de dados, tendo em vista que o principal propósito dessa API é tornar mais flexível e eficiente o processamento de coleções. A Listagem 5 mostra como criar uma stream ao invocar o método stream() a partir da interface java.util.Collection.
Nesse trecho de código, primeiramente uma lista de strings é definida e três objetos são adicionados a ela. Em seguida, uma stream de strings é obtida ao chamar o método items.stream(), na linha 7. Outra forma de criar streams é invocando o método parallelStream(), que possibilitará paralelizar o seu processamento.
O método stream() também foi adicionado à interface java.util.map. A Listagem 6 mostra um exemplo de como criar uma stream a partir dessa interface.
Além disso, uma stream pode ser gerada a partir de I/O, arrays e valores. Para obter uma stream a partir de valores ou arrays é muito simples: basta chamar os métodos estáticos Stream.of() ou Arrays.stream(), como mostra o código a seguir:
Por sua vez, para criar uma stream de linhas a partir do conteúdo de um arquivo texto (I/O), pode-se chamar o método estático Files.lines(Path path). No código a seguir, por exemplo, é possível descobrir a quantidade de linhas que um arquivo possui: