English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Java 8 El API añade una nueva abstracción llamada Stream, que te permite manejar datos de manera declarativa.
Stream proporciona una alta abstracción de operaciones y expresiones de conjuntos de Java de manera intuitiva, similar a la forma en que se realiza una consulta a una base de datos con una sentencia SQL.
El API de Stream puede aumentar enormemente la productividad de los programadores de Java, permitiéndoles escribir código eficiente, limpio y conciso.
Este estilo considera la colección de elementos a procesar como un flujo, que se transmite a través de tuberías y puede ser procesado en los nodos de las tuberías, como filtrado, ordenación, agregación, etc.
El flujo de elementos pasa por el procesamiento de operaciones intermedias (operaciones intermedias) en el tubo, y finalmente obtiene el resultado procesado anteriormente mediante la operación terminal (operación terminal).
+--------------------+ +------+ +------+ +---+ +-------+ | stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect| +--------------------+ +------+ +------+ +---+ +-------+
El flujo anterior se convierte en código Java como follows:
List<Integer> transactionsIds = widgets.stream() .filter(b -> b.getColor() == RED) .sorted((x,y) -> x.getWeight() - y.getWeight()) .mapToInt(Widget::getWeight) .sum();
Stream (flujo) es una cola de elementos provenientes de una fuente de datos y admite operaciones de agregación
Cola de elementos Los elementos son objetos de tipo específico, formando una cola. Java no almacena elementos en Stream, sino que los calcula según necesidad.
Fuente de datos Origen del flujo. Puede ser una colección, un array, un I/O canal, generador, etc.
Operaciones de agregación Operaciones similares a las sentencias SQL, como filter, map, reduce, find, match, sorted, etc.
Y diferentes de las operaciones de Collection anteriores, las operaciones de Stream también tienen dos características básicas:
Pipelining: Las operaciones intermedias siempre retornan el objeto de flujo. De esta manera, múltiples operaciones pueden concatenarse en una tubería, al estilo de flujo (fluent style). Esto permite optimizar las operaciones, como la ejecución diferida (laziness) y el cortocircuito (short-circuito).
Iteración interna: Anteriormente, la recorrida de la colección se realizaba a través de Iterator o For-Cada una de las formas, itera explícitamente fuera de la colección, lo que se llama iteración externa. Stream proporciona una forma de iteración interna, implementada mediante el patrón Visitor (visitador).
En Java 8 En, la interfaz de la colección tiene dos métodos para generar flujos:
stream() − Crear un flujo secuencial para 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());
Stream proporciona un nuevo método 'forEach' para iterar cada dato en el flujo. El siguiente fragmento de código utiliza forEach para salida10个随机数:
Random random = new Random(); random.ints().limit(10).forEach(System.out::println);
map 方法用于映射每个元素到对应的结果,以下代码片段使用 map 输出了元素对应的平方数:
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());
filter 方法用于通过设置的条件过滤出元素。以下代码片段使用 filter 方法过滤出空字符串:
List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); // 获取空字符串的数量 long count = strings.stream().filter(string -> string.isEmpty()).count();
limit 方法用于获取指定数量的流。 以下代码片段使用 limit 方法打印出 10 条数据:
Random random = new Random(); random.ints().limit(10).forEach(System.out::println);
sorted 方法用于对流进行排序。以下代码片段使用 sorted 方法对输出的 10 个随机数进行排序:
Random random = new Random(); random.ints().limit(10).sorted().forEach(System.out::println);
parallelStream 是流并行处理程序的代替方法。以下示例我们使用 parallelStream 来输出空字符串的数量:
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); // 获取空字符串的数量 long count = strings.parallelStream().filter(string -> string.isEmpty()).count();
我们可以很容易地在顺序运行和并行直接切换。
Collectors 类实现了很多归约操作,例如将流转换成集合和聚合元素。Collectors 可用于返回列表或字符串:
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("Cadena combinada: " + mergedString);
Además, algunos colectores que generan estadísticas son muy útiles. Se utilizan principalmente en tipos básicos como int, double, long, y pueden generar estadísticas similares a las siguientes.
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5); IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics(); System.out.println("Número más grande de la lista: "); + stats.getMax()); System.out.println("Número más pequeño de la lista: "); + stats.getMin()); System.out.println("Suma total de todos los números: "); + stats.getSum()); System.out.println("Promedio: "); + stats.getAverage());
Coloque el siguiente código en Java8En el archivo Tester.java:
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("Usando Java" 7: "); // Calcular cadenas de caracteres en blanco List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); System.out.println("列表: " +strings); long count = getCountEmptyStringUsingJava7(strings); System.out.println("Número de caracteres en blanco: " + count); count = getCountLength2UsingJava7(strings); System.out.println("Longitud de la cadena: " 3 的数量为: " + count); // Eliminar cadenas de caracteres vacías List<String> filtered = deleteEmptyStringsUsingJava7(strings); System.out.println("Lista filtrada: " + filtered); // Eliminar cadenas de caracteres vacías y unirlas con comas String mergedString = getMergedStringUsingJava7(strings,", "); System.out.println("Cadena combinada: " + mergedString); List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5); // Obtener números cuadrados de la lista List<Integer> squaresList = getSquares(numbers); System.out.println("Lista de números cuadrados: " + squaresList); List<Integer> integers = Arrays.asList(1,2,13,4,15,6,17,8,19); System.out.println("列表: " +integers); System.out.println("Número más grande de la lista: "); + getMax(integers)); System.out.println("Número más pequeño de la lista: "); + getMin(integers)); System.out.println("Suma total de todos los números: "); + getSum(integers)); System.out.println("Promedio: "); + getAverage(integers)); System.out.println("Número aleatorio: "); // salida10números aleatorios Random random = new Random(); for(int i=0; i < 10; i++{ System.out.println(random.nextInt()); } System.out.println("Usando Java" 8: "); System.out.println("列表: " +strings); count = strings.stream().filter(string->string.isEmpty()).count(); System.out.println("Número de cadenas vacías: " + count); count = strings.stream().filter(string -> string.length() == 3).count(); System.out.println("Longitud de la cadena: " 3 的数量为: " + count); filtered = strings.stream().filter(string -!string.isEmpty()).collect(Collectors.toList()); System.out.println("Lista filtrada: " + filtered); mergedString = strings.stream().filter(string -!string.isEmpty()).collect(Collectors.joining(", ")); System.out.println("Cadena combinada: " + mergedString); squaresList = numbers.stream().map(i ->i*i).distinct().collect(Collectors.toList()); System.out.println("Cuadrados de Lista: " + squaresList); System.out.println("列表: " +integers); IntSummaryStatistics stats = integers.stream().mapToInt((x) ->x).summaryStatistics(); System.out.println("Número más grande de la lista: "); + stats.getMax()); System.out.println("Número más pequeño de la lista: "); + stats.getMin()); System.out.println("Suma total de todos los números: "); + stats.getSum()); System.out.println("Promedio: "); + stats.getAverage()); System.out.println("Número aleatorio: "); random.ints().limit(10).sorted().forEach(System.out::println); // procesamiento paralelo count = strings.parallelStream().filter(string -> string.isEmpty()).count(); System.out.println("La cantidad de cadenas vacías es: "); + count); } private static int getCountEmptyStringUsingJava7(List<String> strings) { int count = 0; for(String string: strings) { if(string.isEmpty()) { count++; } } return count; } private static int getCountLength2UsingJava7(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(); } }
Ejecutar el siguiente script, el resultado de salida será:
$ javac Java8Tester.java $ java Java8Tester Usar Java 7: Lista: [abc, , bc, efg, abcd, , jkl] Número de caracteres vacíos: 2 Longitud de la cadena: 3 Número de: 3 Lista filtrada: [abc, bc, efg, abcd, jkl] Combinar cadenas: abc, bc, efg, abcd, jkl Lista de números cuadrados: [9, 4, 49, 25] Lista: [1, 2, 13, 4, 15, 6, 17, 8, 19] Número más grande en la lista: 19 Número más pequeño en la lista: 1 Suma total de todos los números: 85 Promedio: 9 Número aleatorio: -393170844 -963842252 447036679 -1043163142 -881079698 221586850 -1101570113 576190039 -1045184578 1647841045 Usar Java 8: Lista: [abc, , bc, efg, abcd, , jkl] Número de cadenas vacías: 2 Longitud de la cadena: 3 Número de: 3 Lista filtrada: [abc, bc, efg, abcd, jkl] Combinar cadenas: abc, bc, efg, abcd, jkl Lista de cuadrados: [9, 4, 49, 25] Lista: [1, 2, 13, 4, 15, 6, 17, 8, 19] Número más grande en la lista: 19 Número más pequeño en la lista: 1 Suma total de todos los números: 85 Promedio: 9.444444444444445 Número aleatorio: -1743813696 -1301974944 -1299484995 -779981186 136544902 555792023 1243315896 1264920849 1472077135 1706423674 Número de cadenas vacías: 2