Latest web development tutorials

Java 8 Corriente

Java 8 nuevas características Java 8 nuevas características


Java API 8 añade una nueva abstracción llamada corriente del arroyo, le permite procesar los datos de una manera declarativa.

Corriente utiliza un sentencias SQL similares para consultar los datos de una base de datos de una forma intuitiva para proporcionar un nivel más alto de abstracción y expresión de Java establecer operaciones.

API de flujo puede proporcionar en gran medida la productividad del programador de Java, lo que permite a los programadores escribir código eficiente, limpia y sencilla.

Este elemento de estilo para ser tratada como una especie de colección de flujo de la corriente en la transmisión de tuberías, y puede ser procesado en el nodo de la tubería, como el filtrado, la clasificación, la polimerización.

Elementos de flujo en la tubería a través de un procesamiento de operaciones intermedias (operación intermedia), y finalmente consiguen los resultados de procesado previamente por la operación final (el funcionamiento del terminal).

+--------------------+       +------+   +------+   +---+   +-------+
| stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect|
+--------------------+       +------+   +------+   +---+   +-------+

Los procesos anteriores en código Java:

List<Integer> transactionsIds = 
widgets.stream()
             .filter(b -> b.getColor() == RED)
             .sorted((x,y) -> x.getWeight() - y.getWeight())
             .mapToInt(Widget::getWeight)
             .sum();

¿Qué es un flujo?

Elemento de la cola corriente (corriente) es un soporte de la fuente de datos y operaciones de agregado

  • Los elementos son tipos específicos de objetos, formando una cola. En Java corriente no almacena elementos, pero la informática bajo demanda.
  • Fuente fuente de flujo de datos. Se puede establecer, matrices, E / S remotas, el generador y otros generadores.
  • La polimerización es similar a las sentencias SQL de las operaciones, tales como filtro, mapa, reducir, encontrar, partido, ordenados y así sucesivamente.

Cobro anterior operar diferente, el funcionamiento corriente hay dos características básicas:

  • Pipelining: operación intermedia devolverá un objeto de flujo en sí. De modo que las operaciones múltiples se pueden concatenar en una sola tubería, como corriente de estilo (estilo fluido). Esta operación se puede optimizar, tales como retraso en la ejecución (la pereza) y de cortocircuito (cortocircuito).
  • iteración interna: antes de recorrido de recogida a través de iterador o para-Cada manera, explícita iterate recolección externa, esto se llama iteración externo. Flujo proporciona una manera iterativa interna a través de la implementación visitor (Visitante).

generación de flujo

En Java 8, la interfaz conjunto tiene dos métodos para generar la corriente:

  • corriente () - crear una corriente de serie de la colección.

  • parallelStream () - crear un flujo paralelo para la colección.

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());

forEach

Corriente proporciona un nuevo método de 'forEach' para recorrer cada flujo de datos. El siguiente fragmento de código utiliza la salida forEach de 10 números aleatorios:

Random random = new Random();
random.ints().limit(10).forEach(System.out::println);

mapa

método de mapa para el mapeo de cada elemento correspondiente al resultado, el siguiente fragmento de código utiliza la salida del mapa correspondiente al número de elementos cuadrados:

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
// 获取对应的平方数
List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());

filtro

método de filtro se utiliza para establecer las condiciones mediante la filtración de elementos. El fragmento de código siguiente, se utiliza el filtro método de filtro de la cadena vacía:

List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// 获取空字符串的数量
int count = strings.stream().filter(string -> string.isEmpty()).count();

límite

limitar método para adquirir un número determinado de flujos. El siguiente fragmento de código utiliza el método de límite de imprimir los datos 10:

Random random = new Random();
random.ints().limit(10).forEach(System.out::println);

ordenados

Un método para la convección ordenadas orden. El fragmento de código siguiente utiliza métodos ordenados al azar 10 tipo de salida de los números:

Random random = new Random();
random.ints().limit(10).sorted().forEach(System.out::println);

programa paralelo (paralelo)

parallelStream es paralela sustituto controlador de flujo. Usamos el siguiente ejemplo para la producción de un número de cuerda parallelStream vacío:

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// 获取空字符串的数量
int count = strings.parallelStream().filter(string -> string.isEmpty()).count();

Podemos cambiar fácilmente con el fin de ejecutar en paralelo y directa.


colectores

Colectores clase implementa una serie de operaciones de reducción, por ejemplo, va a transmitir en la recopilación y agregación de elementos. Los coleccionistas pueden ser utilizados para devolver una lista o cadena:

List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());

System.out.println("筛选列表: " + filtered);
String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));
System.out.println("合并字符串: " + mergedString);

estadística

Además, algunos producen colector estadísticas también muy útil. Se utilizan principalmente para int básicos Tipo, doble, larga, etc., que se puede utilizar para generar resultados estadísticos similares a lo siguiente.

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);

IntSummaryStatistics stats = integers.stream().mapToInt((x) -> x).summaryStatistics();

System.out.println("列表中最大的数 : " + stats.getMax());
System.out.println("列表中最小的数 : " + stats.getMin());
System.out.println("所有数之和 : " + stats.getSum());
System.out.println("平均数 : " + stats.getAverage());

Corriente instancia completa

Java8Tester.java el código siguiente en el archivo:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
import java.util.Map;

public class Java8Tester {
   public static void main(String args[]){
      System.out.println("使用 Java 7: ");
		
      // 计算空字符串
      List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
      System.out.println("列表: " +strings);
      long count = getCountEmptyStringUsingJava7(strings);
		
      System.out.println("空字符数量为: " + count);
      count = getCountLength3UsingJava7(strings);
		
      System.out.println("字符串长度为 3 的数量为: " + count);
		
      // 删除空字符串
      List<String> filtered = deleteEmptyStringsUsingJava7(strings);
      System.out.println("筛选后的列表: " + filtered);
		
      // 删除空字符串,并使用逗号把它们合并起来
      String mergedString = getMergedStringUsingJava7(strings,", ");
      System.out.println("合并字符串: " + mergedString);
      List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
		
      // 获取列表元素平方数
      List<Integer> squaresList = getSquares(numbers);
      System.out.println("平方数列表: " + squaresList);
      List<Integer> integers = Arrays.asList(1,2,13,4,15,6,17,8,19);
		
      System.out.println("列表: " +integers);
      System.out.println("列表中最大的数 : " + getMax(integers));
      System.out.println("列表中最小的数 : " + getMin(integers));
      System.out.println("所有数之和 : " + getSum(integers));
      System.out.println("平均数 : " + getAverage(integers));
      System.out.println("随机数: ");
		
      // 输出10个随机数
      Random random = new Random();
		
      for(int i=0; i < 10; i++){
         System.out.println(random.nextInt());
      }
		
      System.out.println("使用 Java 8: ");
      System.out.println("列表: " +strings);
		
      count = strings.stream().filter(string->string.isEmpty()).count();
      System.out.println("空字符串数量为: " + count);
		
      count = strings.stream().filter(string -> string.length() == 3).count();
      System.out.println("字符串长度为 3 的数量为: " + count);
		
      filtered = strings.stream().filter(string ->!string.isEmpty()).collect(Collectors.toList());
      System.out.println("筛选后的列表: " + filtered);
		
      mergedString = strings.stream().filter(string ->!string.isEmpty()).collect(Collectors.joining(", "));
      System.out.println("合并字符串: " + mergedString);
		
      squaresList = numbers.stream().map( i ->i*i).distinct().collect(Collectors.toList());
      System.out.println("Squares List: " + squaresList);
      System.out.println("列表: " +integers);
		
      IntSummaryStatistics stats = integers.stream().mapToInt((x) ->x).summaryStatistics();
		
      System.out.println("列表中最大的数 : " + stats.getMax());
      System.out.println("列表中最小的数 : " + stats.getMin());
      System.out.println("所有数之和 : " + stats.getSum());
      System.out.println("平均数 : " + stats.getAverage());
      System.out.println("随机数: ");
		
      random.ints().limit(10).sorted().forEach(System.out::println);
		
      // 并行处理
      count = strings.parallelStream().filter(string -> string.isEmpty()).count();
      System.out.println("空字符串的数量为: " + count);
   }
	
   private static int getCountEmptyStringUsingJava7(List<String> strings){
      int count = 0;
		
      for(String string: strings){
		
         if(string.isEmpty()){
            count++;
         }
      }
      return count;
   }
	
   private static int getCountLength3UsingJava7(List<String> strings){
      int count = 0;
		
      for(String string: strings){
		
         if(string.length() == 3){
            count++;
         }
      }
      return count;
   }
	
   private static List<String> deleteEmptyStringsUsingJava7(List<String> strings){
      List<String> filteredList = new ArrayList<String>();
		
      for(String string: strings){
		
         if(!string.isEmpty()){
             filteredList.add(string);
         }
      }
      return filteredList;
   }
	
   private static String getMergedStringUsingJava7(List<String> strings, String separator){
      StringBuilder stringBuilder = new StringBuilder();
		
      for(String string: strings){
		
         if(!string.isEmpty()){
            stringBuilder.append(string);
            stringBuilder.append(separator);
         }
      }
      String mergedString = stringBuilder.toString();
      return mergedString.substring(0, mergedString.length()-2);
   }
	
   private static List<Integer> getSquares(List<Integer> numbers){
      List<Integer> squaresList = new ArrayList<Integer>();
		
      for(Integer number: numbers){
         Integer square = new Integer(number.intValue() * number.intValue());
			
         if(!squaresList.contains(square)){
            squaresList.add(square);
         }
      }
      return squaresList;
   }
	
   private static int getMax(List<Integer> numbers){
      int max = numbers.get(0);
		
      for(int i=1;i < numbers.size();i++){
		
         Integer number = numbers.get(i);
			
         if(number.intValue() > max){
            max = number.intValue();
         }
      }
      return max;
   }
	
   private static int getMin(List<Integer> numbers){
      int min = numbers.get(0);
		
      for(int i=1;i < numbers.size();i++){
         Integer number = numbers.get(i);
		
         if(number.intValue() < min){
            min = number.intValue();
         }
      }
      return min;
   }
	
   private static int getSum(List numbers){
      int sum = (int)(numbers.get(0));
		
      for(int i=1;i < numbers.size();i++){
         sum += (int)numbers.get(i);
      }
      return sum;
   }
	
   private static int getAverage(List<Integer> numbers){
      return getSum(numbers) / numbers.size();
   }
}

Aplicación de la secuencia de comandos anterior, la salida es:

$ javac Java8Tester.java 
$ java Java8Tester
使用 Java 7: 
列表: [abc, , bc, efg, abcd, , jkl]
空字符数量为: 2
字符串长度为 3 的数量为: 3
筛选后的列表: [abc, bc, efg, abcd, jkl]
合并字符串: abc, bc, efg, abcd, jkl
平方数列表: [9, 4, 49, 25]
列表: [1, 2, 13, 4, 15, 6, 17, 8, 19]
列表中最大的数 : 19
列表中最小的数 : 1
所有数之和 : 85
平均数 : 9
随机数: 
-393170844
-963842252
447036679
-1043163142
-881079698
221586850
-1101570113
576190039
-1045184578
1647841045
使用 Java 8: 
列表: [abc, , bc, efg, abcd, , jkl]
空字符串数量为: 2
字符串长度为 3 的数量为: 3
筛选后的列表: [abc, bc, efg, abcd, jkl]
合并字符串: abc, bc, efg, abcd, jkl
Squares List: [9, 4, 49, 25]
列表: [1, 2, 13, 4, 15, 6, 17, 8, 19]
列表中最大的数 : 19
列表中最小的数 : 1
所有数之和 : 85
平均数 : 9.444444444444445
随机数: 
-1743813696
-1301974944
-1299484995
-779981186
136544902
555792023
1243315896
1264920849
1472077135
1706423674
空字符串的数量为: 2

Java 8 nuevas características Java 8 nuevas características