Criação de Stream
Você viu que podemos colocar qualquer coleção dentro de uma stream com o método stream da interface Collection. Se você tem um array, use o método static Stream.of.
Stream<String> words = Stream.of(contents.split(“\\PL+”));
// retorna um array de um String[]
O método tem um parâmetro varargs (https://dicasdejava.com.br/java-varargs/), então você pode construir um stream com qualquer número de argumentos:
Stream<String> song = Stream.of(“suave”, “abaixo”, “o”, “fluxo”);
Use Arrays.stream(array, from, to) para fazer um stream do array de elementos; from (inclusive) e to (exclusivo).
Para fazer um stream sem elementos, use o método static Stream.empty:
Stream<String> silence = Stream.empty();
// tipo Generic<String> é inferido; o mesmo que Stream.<String>empty()
A interface Stream tem dois métodos estáticos para fazer infinitas streams. O método generate pega uma função sem argumentos (ou, tecnicamente, um objeto da interface Supplier<T>).
Sempre que o valor da stream é necessário, esta função é chamada para produzir um valor.
Você pode conseguir o valor da constante de uma stream com: Stream<String> echos = String.generate(() -> “Echo”); ou um número randômico com: Stream<Double> randoms = Stream.generate(Math::random);
Para produzir infinitas sequências, tais como 0 1 2 3 …, use o método iterate. Pega um valor e uma função (tecnicamente, um UnaryOperator<T>) e repetidamente aplica a função para o resultado anterior.
Por exemplo, Stream<BigInteger> integers = Stream.iterate(BigInteger.ZERO, n -> n.add(BigInteger.ONE));
O primeiro elemento da sequência é o BigInteger.ZERO. O segundo elemento é o f(seed), ou 1 (como um big integer). O próximo elemento é o f(f(seed)), ou 2, e assim por diante.
Veja: há muitos métodos na API Java dos campos streams. Por exemplo, a classe Pattern tem o método splitAsStream que separa uma CharSequence por uma expressão regular.
Você pode usar a seguinte instrução para dividir uma sequência em palavras:
Stream<String> words = Pattern.compile(\\PL+).splitAsStream(contents);
O método static Files.lines retorna uma Stream de todas as linhas em um arquivo:
try (Stream<String> lines = Files.lines(path)){
Linhas processadas
}
O código mostra várias maneiras de criar um stream.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
import java.io.IOException; import java.math.BigInteger; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; public class CreatingStreams{ public static <T> void show(String title, Stream<T> stream){ final int SIZE = 10; List<T> firstElements = stream.limit(SIZE+1) .collect(Collectors.toList()); System.out.print(title + ": "); for(int i = 0; i < firstElements.size(); i++){ if(i > 0) System.out.print(","); if(i < SIZE) System.out.print(firstElements.get(i)); else System.out.print("..."); } System.out.println(); } public static void main(String[] args) throws IOException{ Path path = Paths.get("alice.txt"); String contents = new String(Files.readAllBytes(path), StandardCharsets.UTF_8); Stream<String> words = Stream.of(contents.split("\\PL+")); show("words", words); System.out.println(); Stream<String> song = Stream.of("suave", "abaixo", "o", "fluxo"); show("song", song); System.out.println(); Stream<String> silence = Stream.empty(); show("silence", silence); System.out.println(); Stream<String> echos = Stream.generate(() -> "Echo"); show("echos", echos); System.out.println(); Stream<Double> randoms = Stream.generate(Math::random); show("randoms", randoms); System.out.println(); Stream<BigInteger> integers = Stream .iterate(BigInteger.ONE, n -> n.add(BigInteger.ONE)); show("integers", integers); System.out.println(); Stream<String> wordsAnotherWay = Pattern.compile("\\PL+") .splitAsStream(contents); show("wordsAnotherWay", wordsAnotherWay); System.out.println(); try(Stream<String> lines = Files.lines(path, StandardCharsets.ISO_8859_1)){ show("lines", lines); } } } |
Deixe um comentário