package ar.com.javacuriosities.streams; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.net.URL; import java.nio.file.FileVisitOption; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.regex.Pattern; import java.util.stream.IntStream; import java.util.stream.Stream; /* * En Java 1.8 se agregaron un total de 95 en 23 clases, los cuales podemos usar * para construir Streams */ public class Lesson03NewMethods { public static void main(String[] args) { try { /* * Collection Interface: Posee dos métodos - stream(): Crea un * Stream en base a la collection - parallelStream(): Un Stream * paralelo por medio del framework Fork/Join */ List<String> words = new ArrayList<>(); words.add("Hello"); words.add("Streams"); words.stream(); words.parallelStream(); // Se agrego el método stream() en la clase Arrays, solo provee // streams secuenciales IntStream numbers = Arrays.stream(new int[] { 1, 2, 3, 4, 5 }); numbers.forEach(System.out::println); /* * La clase Files contiene varios métodos que generan Streams */ System.out.println("Reading files in directory"); URL resourceUrl = Thread.currentThread().getContextClassLoader().getResource("data"); try (Stream<Path> paths = Files.list(Paths.get(resourceUrl.toURI()))) { paths.forEach(System.out::println); } System.out.println("Reading lines from file"); resourceUrl = Thread.currentThread().getContextClassLoader().getResource("data/lines.txt"); try (Stream<String> lines = Files.lines(Paths.get(resourceUrl.toURI()))) { lines.forEach(System.out::println); } System.out.println("Walking directory"); resourceUrl = Thread.currentThread().getContextClassLoader().getResource("data"); try (Stream<Path> paths = Files.walk(Paths.get(resourceUrl.toURI()), FileVisitOption.FOLLOW_LINKS)) { paths.forEach(System.out::println); } // Se agrego el método lines() a la clase BufferedReader System.out.println("Reading lines from line using BufferedReader"); resourceUrl = Thread.currentThread().getContextClassLoader().getResource("data/lines.txt"); try (BufferedReader reader = new BufferedReader(new FileReader(new File(resourceUrl.toURI())))) { Stream<String> lines = reader.lines(); lines.forEach(System.out::println); } // Se agrego el método splitAsStream a la clase Pattern System.out.println("Using splitAsStream method"); Pattern pattern = Pattern.compile(","); Stream<String> splitAsStream = pattern.splitAsStream("Hello,Streams,Java"); splitAsStream.forEach(System.out::println); // Se agrego el método chars en la interface CharSequence System.out.println("Converting chars as int in a CharSequence"); String message = "Hello"; IntStream chars = message.chars(); chars.forEach(System.out::println); // Tenemos varios métodos estáticos en la interfaz Stream Stream<String> firstPart = Stream.of("Hello"); Stream<String> secondPart = Stream.of(" "); Stream<String> thirdPart = Stream.of("World"); Stream<String> partialStrem = Stream.concat(firstPart, secondPart); Stream<String> finalMessage = Stream.concat(partialStrem, thirdPart); finalMessage.forEach(System.out::print); // Podemos generar rangos usando IntStream y el método range() IntStream range = IntStream.range(0, 10); range.forEach(System.out::println); } catch (Exception e) { // Log and Handle exception e.printStackTrace(); } } }