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.
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