Criando Streams em Java a Partir de Diferentes Fontes

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 + "'}";
    }
}

Tags: java Stream Collections Arrays Files

Publicado em 6-7 04:14 por Thomas