package com.trifulcas.arrays;
import java.util.Arrays;
import java.util.stream.IntStream;
public class EjemplosStreams {
public static void main(String[] args) {
int[] numeros = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// Creo un stream a partir de un array
IntStream miStream = Arrays.stream(numeros);
// Puedo utilizar los métodos que tiene stream. Vemos ejemplos
// foreach nos permite iterar sobre cada elemento
// Utilizo una función lambda (en JS eran flechas, se parecen mucho)
// Sintaxis del lambda: parametro->valor que retorno o código
miStream.forEach(x -> System.out.println(x));
// Otra manera
miStream = Arrays.stream(numeros);
// Indico directamente cual es la función que se va a aplicar a los elementos del array
miStream.forEach(System.out::println);
miStream = Arrays.stream(numeros);
// Puedo filtrar los elementos. En el filter se pide un predicado
IntStream pares = miStream.filter(x -> x % 2 == 0);
pares.forEach(x -> System.out.println(x));
// Si combino filter con count lo que tengo es una manera muy sencilla
// De averiguar cuantos elementos en un array cumplen una condición
// Por ejemplo, cuantos pares tengo en un array
long nPares = Arrays.stream(numeros).filter(x -> x % 2 == 0).count();
System.out.println(nPares);
// Tenemos map que nos aplica una transformación a los elementos del stream
String[] words = { "Java", "Python", "C++", "JavaScript" };
// Puedo llamar directamente ala función que quiero aplicar
Arrays.stream(words).map(String::toUpperCase).forEach(System.out::println);
// Puedo utilizar una función lambda
Arrays.stream(words).map(s -> s.toUpperCase()).forEach(System.out::println);
// Usar una lambda
Arrays.stream(numeros).map(x -> doble(x)).forEach(System.out::println);
// Usar la función que tengo definida en mi propia clase
Arrays.stream(numeros).map(EjemplosStreams::doble).forEach(System.out::println);
// reduce para hacer operaciones sobre los elementos del stream
// El ejemplo más común es la suma. Inicializo a cero y después sumo
int sum = Arrays.stream(numeros).reduce(0, (x, y) -> x + y);
System.out.println(sum);
// La opción de máximo y mínimo. Uso getAsInt porque el tipo que devuelve
// es un OptionalInt
int max = Arrays.stream(numeros).max().getAsInt();
int min = Arrays.stream(numeros).min().getAsInt();
System.out.println("Máximo: " + max + ", Mínimo: " + min);
}
static int doble(int n) {
return n * 2;
}
static int parityNumber(int[] nums) {
long even = Arrays.stream(nums).filter(x -> x % 2 == 0).count();
long odd = nums.length - even;
if (even == odd) {
return 0;
} else if (even > odd) {
return 2;
} else {
return 1;
}
}
}