package ar.com.javacuriosities.streams; import java.util.ArrayList; import java.util.List; import java.util.OptionalInt; /* * Dado que Java es orientado a objetos tenemos algunos tipos primitivos, a partir de Java 1.5 * podemos ir de un tipo primitivo a objeto sin ningún esfuerzo dado que se agrego lo que se conoce * como autoboxing and unboxing, pero esto puede afectar la performance. * Si analizamos como esto puede afectar los Streams veremos que solo podemos almacenar objetos lo cual * genera que si usamos tipos primitivos estaremos haciendo boxing and unboxing para cada elemento lo cual * agrega un overhead innecesario, por esto mismo además del tipo Stream hay soporte para los tipos * DoubleStream, IntStream y LongStream * */ public class Lesson02PrimitiveStreams { public static void main(String[] args) { List<Student> students = new ArrayList<>(); students.add(new Student(2014, 0)); students.add(new Student(2015, 3)); students.add(new Student(2015, 6)); students.add(new Student(2015, 9)); students.add(new Student(2014, 12)); // Aquí en lugar de ejecutar el método map el cual retorna un Stream, usamos el método mapToInt el cual retorna un IntStream OptionalInt maximumNumberOfCourses = students.stream().filter(s -> s.getYear() == 2015).mapToInt(s -> s.getNumberOfCourses()).max(); // Aquí usamos la clase Optional la cual representa un valor que puede ser nulo maximumNumberOfCourses.ifPresent(number -> System.out.println("The maximum number is: " + number)); } private static final class Student { private int year; private int numberOfCourses; public Student(int year, int numberOfCourses) { super(); this.year = year; this.numberOfCourses = numberOfCourses; } public int getYear() { return year; } public int getNumberOfCourses() { return numberOfCourses; } } }