Java8 NMM

NMM

Antecedentes:
En el cálculo de calorías de menú,

int calories = menu.stream().map(Dish::getCalories).reduce(0,Integer::sum);

Problema:
el coste de embalaje implica realización, cada entero debe desempaquetar en un tipo primitivo, entonces sumada.

Solución:
Java8 introdujo tres tipos de flujo especializada interfaces de primitivas para resolver este problema: IntStream, DoubleStream y LongStream, respectivamente fluir en el elemento Laid int, largo y doble, evitando así los gastos de embalaje implícitas.
De flujo asignada al valor 1.
Cuando el método convencional se convierte en versión especializada de la corriente mapToInt, mapToDouble y mapToLong. Estos métodos y formas de trabajo frente a ese método mapa de la misma, pero su regreso es una corriente especializada, en lugar de corriente. Por ejemplo, la suma de calorías en menú con mapToInt:

int calories  = menu.stream().mapToInt(Dish::getCalories).sum();

2. La parte posterior conversión a la corriente objeto
Del mismo modo, una vez que tenga la cadena de valor, es posible que desee convertir de nuevo en un flujo no especializado.

IntStream intStream = menu.stream().mapToInt(Dish::getCalories);
Stream<Integer> stream = intStream.boxed();

3. Por defecto OptionalInt
Opcional La parametrizable con entero, cadena tipos otra referencia. Especializado para los tres flujo original, también hubo una versión especializada del modelo original Opcional: OptionalInt, OptionalDouble y OptionalLong.

rango de valores

Java8 introduce dos métodos estáticos se pueden usar IntStream LongStream y para ayudar a generar un intervalo tal: gama y rangeClosed. Ambos métodos son el valor de partida aceptable de un parámetro, el segundo valor final del parámetro de recepción. Pero eso no incluye el final del rango de valores, y rangeClosed contiene el valor final. La selección de un número par, por ejemplo 1 a 100 de:

IntStream evenNumbers = IntStream.rangeClosed(1,100).filter(n -> n % 2 == 0);
System.out.println(evenNumbers.count());

return resultado del ejemplo es 50, rangeClosed es el valor de conteo final.
Si el interruptor IntStream.range (1100), el resultado será un número par de 49, ya que el rango no incluye el valor final.

Flujos de construcción

Creado por la cadena de valor

Utilice el método estático Stream.of, creando una corriente a través valor explícito. Se puede aceptar cualquier número de argumentos. Por ejemplo, el siguiente código se utiliza directamente para crear un flujo de Stream.of cadena.

Stream<String> stream = Stream.of("Java 8","Lambda","In ","Action");
stream.map(String::toUpperCase).forEach(System.out::println);

Además, también se puede utilizar para obtener una corriente de vacío en blanco, como sigue:

Stream<String> emptyStream = Stream.empty();

Creado por una matriz de flujo

Puede utilizar los métodos estáticos Arrays.stream crear un flujo de la matriz, acepta una matriz como un parámetro. Por ejemplo, una matriz de tipo int primitivo puede ser convertido en un IntStream, como sigue:

int[] numbers = {2,3,5,7,11,13};
int sum = Arrays.stream(numbers).sum();

Generado a partir de la secuencia de archivo

api archivos Java NIO para el procesamiento de I / O operación se ha actualizado para aprovechar la corriente API. java.nio.file.Files muchas de las declaraciones de método estático de un arroyo. Por ejemplo, un método útil es Files.lines, devolverá una corriente que consiste en una cadena de cada fila del archivo especificado. Por ejemplo, el siguiente ejemplo de cómo muchas palabras diferentes de ver un archivo son:

long uniqueWords = 0;
try(Stream<String> lines = 
		Files.lines(Paths.get("data.txt"),Charset.defaultCharset())){
	uniqueWords = lines.flatMap( line -> Arrays.stream(line.split(" ")))
			.distinct().count()
	)
}catch(Exception e){

}

El flujo generado por la función: crear un flujo ilimitado

API corriente proporciona dos métodos estáticos para generar el flujo de la función :. Stream.iterate y Stream.generate dos operaciones pueden crear un denominado flujo infinito: no tamaño que fijo con una corriente de flujo de un conjunto fijo creado. Producido por el flujo y generan iterate crea valor de demanda con una función dada, se puede calcular hacia abajo sin fin. En general, el uso límite (n) que se limita a esta corriente, un número infinito de valores a la impresión evitar.
1. La iteración

Stream.iterate(0,n -> n + 2.limit(10).forEach(System.out::println);

En la forma de realización según los valores de parámetros se generan en el siguiente ciclo, el valor inicial 0, cada iteración aumenta 2,2,4,6,8 ...
2. Generar
un método similar al iterate, Generar método también permite prensa debe generar un flujo ilimitado. Pero no a su vez generan valor para cada nueva generación de función de aplicación. Se acepta un Proveedor de proporcionar un nuevo tipo de valores de Lambda.

Stream.generate(Math::random)
		.limit(5).forEach(System.out::println);
Publicado 75 artículos originales · ganado elogios 7 · Vistas a 10000 +

Supongo que te gusta

Origin blog.csdn.net/zhengdong12345/article/details/102596720
Recomendado
Clasificación