Métodos para Instanciar Streams
Streams em Java podem ser originados de diversas fontes, incluindo coleções, valores literais, arrays e recursos de arquivo.
Stream a Partir de Coleções
Trensforme uma lista ou outra coleção em um fluxo utilizando o método stream().
private static Stream<String> gerarStreamDeColecao() {
List<String> elementos = Arrays.asList("primeiro", "segundo", "terceiro");
return elementos.stream();
}
Stream a Partir de Valores Diretos
Crie um fluxo com elementos específicos usando Stream.of().
private static Stream<String> gerarStreamDeValores() {
return Stream.of("alfa", "beta", "gama");
}
Stream a Partir de Arrays
Converta arrays existentes em streams com Arrays.stream().
private static Stream<String> gerarStreamDeArray() {
String[] termos = new String[]{"delta", "epsilon", "zeta"};
return Arrays.stream(termos);
}
Stream a Partir de Arquivos
Leia linhas de um arquivo de texto utilizando a API NIO para gerar um fluxo.
private static Stream<String> gerarStreamDeArquivo() {
Path caminho = Paths.get("recursos/dados.txt");
Stream<String> linhas = null;
try {
linhas = Files.lines(caminho);
} catch (IOException e) {
throw new RuntimeException("Falha ao acessar o arquivo", e);
}
return linhas;
}
Ao executar, os elementos de cada stream são processados sequencialmente e exibidos no console.
Criação de Streams via Funções
Streams também podem ser gerados iteratiavmente ou mediante fornecedores, produzindo sequências infinitas que requerem delimitação.
Utilizando Stream.iterate
Gere um fluxo infinito a partir de uma semente e uma função de iteração.
private static Stream<Integer> gerarStreamPorIteracao() {
return Stream.iterate(1, valor -> valor * 3).limit(4); // 1, 3, 9, 27
}
Utilizando Stream.generate
Produza valores aleatórios ou derivados de um Supplier.
private static Stream<Double> gerarStreamPorGeracao() {
return Stream.generate(() -> Math.random() * 100).limit(3);
}
Streams de Objetos Customizados
Implemente a interface Supplier para criar fluxos com tipos personalizados.
static class FornecedorRegistro implements Supplier<Registro> {
private int contador = 0;
private Random rand = new Random();
@Override
public Registro get() {
contador = rand.nextInt(1000);
return new Registro(contador, "Entrada-" + contador);
}
}
static class Registro {
private int identificador;
private String descricao;
public Registro(int identificador, String descricao) {
this.identificador = identificador;
this.descricao = descricao;
}
@Override
public String toString() {
return "Registro{id=" + identificador + ", desc='" + descricao + "'}";
}
}