Mi información de contacto
Correo[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Java 8 introduce muchas características nuevas, las más notables son las expresiones Lambda y la API Stream. Stream API proporciona un método eficiente y conciso para procesar datos de recopilación, lo que hace que el código sea más conciso y claro, y tiene una alta legibilidad y mantenibilidad. Este artículo profundizará en el uso de Java Stream API, incluidos conceptos básicos, operaciones comunes, procesamiento paralelo, casos prácticos y mejores prácticas.
Stream API es una abstracción introducida en Java 8 para procesar datos de recopilación que permite que los datos se procesen de manera declarativa (similar a las declaraciones SQL). La API Stream proporciona muchas operaciones poderosas que se pueden usar para filtrar, ordenar, mapear, reducir y otras operaciones en colecciones, simplificando enormemente el código.
La API Stream proporciona una variedad de formas de crear una transmisión. Las más comunes incluyen las siguientes:
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
String[] array = {"a", "b", "c"};
Stream<String> stream = Arrays.stream(array);
Stream.of
:Stream<String> stream = Stream.of("a", "b", "c");
Stream.generate
:Stream<Double> stream = Stream.generate(Math::random).limit(10);
Stream.iterate
:Stream<Integer> stream = Stream.iterate(0, n -> n + 2).limit(10);
Las operaciones intermedias se utilizan para convertir Stream y se evalúan de forma diferida. Las operaciones intermedias comunes incluyen las siguientes:
filter
: utilizado para filtrar elementos.Stream<String> stream = list.stream().filter(s -> s.startsWith("a"));
map
: Se utiliza para asignar cada elemento al resultado correspondiente.Stream<String> stream = list.stream().map(String::toUpperCase);
flatMap
: Se utiliza para convertir cada elemento en un Stream y luego fusionarlo en un Stream.Stream<String> stream = list.stream().flatMap(s -> Stream.of(s.split("")));
distinct
: Se utiliza para eliminar duplicados.Stream<String> stream = list.stream().distinct();
sorted
: utilizado para clasificar.Stream<String> stream = list.stream().sorted();
peek
: Se utiliza para ver cada elemento durante el procesamiento.Stream<String> stream = list.stream().peek(System.out::println);
Las operaciones de terminal se utilizan para iniciar el cálculo de Stream y generar resultados. Las operaciones de terminal comunes incluyen las siguientes:
forEach
: Realiza una operación en cada elemento.list.stream().forEach(System.out::println);
collect
: convierte Stream a otras formas.List<String> result = list.stream().collect(Collectors.toList());
reduce
: Reduce los elementos del Stream a un valor.Optional<String> result = list.stream().reduce((s1, s2) -> s1 + s2);
toArray
:Convierte Stream en matriz.String[] array = list.stream().toArray(String[]::new);
count
: Cuente el número de elementos.long count = list.stream().count();
anyMatch
、allMatch
、noneMatch
: Se utiliza para hacer coincidir el juicio.boolean anyMatch = list.stream().anyMatch(s -> s.startsWith("a"));
boolean allMatch = list.stream().allMatch(s -> s.startsWith("a"));
boolean noneMatch = list.stream().noneMatch(s -> s.startsWith("a"));
findFirst
、findAny
: Se utiliza para buscar elementos.Optional<String> first = list.stream().findFirst();
Optional<String> any = list.stream().findAny();
usarsorted
El método ordena el Stream y puede pasar un comparador.
List<String> list = Arrays.asList("b", "c", "a");
List<String> sortedList = list.stream().sorted().collect(Collectors.toList());
// 逆序排序
List<String> sortedListDesc = list.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
usarfilter
Método para filtrar elementos en Stream.
List<String> list = Arrays.asList("a", "b", "c");
List<String> filteredList = list.stream().filter(s -> s.startsWith("a")).collect(Collectors.toList());
usarmap
El método asigna elementos en el Stream.
List<String> list = Arrays.asList("a", "b", "c");
List<String> mappedList = list.stream().map(String::toUpperCase).collect(Collectors.toList());
usarreduce
Método para reducir los elementos en el Stream.
List<String> list = Arrays.asList("a", "b", "c");
String result = list.stream().reduce("", (s1, s2) -> s1 + s2);
usarcollect
Los métodos convierten Stream a otras formas.
List<String> list = Arrays.asList("a", "b", "c");
List<String> collectedList = list.stream().collect(Collectors.toList());
Set<String> collectedSet = list.stream().collect(Collectors.toSet());
String joinedString = list.stream().collect(Collectors.joining(","));
Parallel Stream puede aprovechar al máximo las ventajas de las CPU multinúcleo para mejorar la eficiencia del procesamiento de datos.puedo usarparallelStream
El método crea una secuencia paralela.
List<String> list = Arrays.asList("a", "b", "c");
List<String> parallelList = list.parallelStream().map(String::toUpperCase).collect(Collectors.toList());
También puede ser usadoparallel
El método convierte un Stream normal en un Stream paralelo.
List<String> list = Arrays.asList("a", "b", "c");
List<String> parallelList = list.stream().parallel().map(String::toUpperCase).collect(Collectors.toList());
Cabe señalar que la transmisión en paralelo no siempre es más rápida que la transmisión en serie y debe probarse de acuerdo con la situación específica.
Dada una colección de cadenas, filtre las cadenas cuya longitud sea inferior a 3 y convierta las cadenas restantes a mayúsculas.
List<String> list = Arrays.asList("a", "ab", "abc", "abcd");
List<String> result = list.stream()
.filter(s -> s.length() >= 3)
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println(result); // 输出:[ABC, ABCD]
Dado un conjunto de números enteros, calcule el promedio de todos los números enteros.
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
OptionalDouble average = list.stream()
.mapToInt(Integer::intValue)
.average();
average.ifPresent(System.out::println); // 输出:3.0
Usando la API de transmisión
Lea el contenido del archivo y envíelo a la consola.
try (Stream<String> lines = Files.lines(Paths.get("example.txt"))) {
lines.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
Lea el contenido del archivo y cuente el número de apariciones de cada palabra.
try (Stream<String> lines = Files.lines(Paths.get("example.txt"))) {
Map<String, Long> wordCount = lines
.flatMap(line -> Arrays.stream(line.split("\W+")))
.collect(Collectors.groupingBy(String::toLowerCase, Collectors.counting()));
wordCount.forEach((word, count) -> System.out.println(word + ": " + count));
} catch (IOException e) {
e.printStackTrace();
}
Digamos que tenemos una tabla de base de datos.users
, que contiene camposid
、name
yage
. Podemos utilizar la API Stream para procesar los resultados de la consulta.
List<User> users = queryDatabase();
List<String> names = users.stream()
.filter(user -> user.getAge() > 18)
.map(User::getName)
.collect(Collectors.toList());
System.out.println(names);
Collectors
La clase ofrece una variedad de coleccionistas y usted puede elegir el coleccionista adecuado según sus necesidades específicas.Una vez que se consume una secuencia, no se puede volver a usar. Si necesita reutilizarla, puede considerar convertir la secuencia en una colección antes de usarla.
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
stream.forEach(System.out::println);
stream.forEach(System.out::println); // 会抛出IllegalStateException
Las transmisiones paralelas no siempre son más rápidas que las transmisiones en serie y deben probarse caso por caso.puedo usarForkJoinPool
Para optimizar el rendimiento de Stream paralelo.
ForkJoinPool customThreadPool = new ForkJoinPool(4);
customThreadPool.submit(() ->
list.parallelStream().forEach(System.out::println)
).get();
Cuando utilice Stream API para procesar grandes cantidades de datos, debe prestar atención al problema de las pérdidas de memoria.puedo usarclose
método para cerrar la transmisión, o usartry-with-resources
La declaración cierra automáticamente la secuencia.
try (Stream<String> lines = Files.lines(Paths.get("example.txt"))) {
lines.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
Este artículo presenta en detalle el uso de Java Stream API, incluidas operaciones básicas, operaciones avanzadas, procesamiento paralelo, casos prácticos y mejores prácticas. Al utilizar racionalmente Stream API, los desarrolladores pueden simplificar enormemente el código, mejorar la legibilidad y el mantenimiento del código y también mejorar la eficiencia del procesamiento de datos. Espero que este artículo le resulte útil para utilizar Stream API en el desarrollo de Java.
Java Stream API es una poderosa herramienta para procesar datos recopilados. Mediante el uso flexible de diversas operaciones, se puede lograr un procesamiento de datos y una computación de transmisión eficientes. Si aún no ha utilizado Stream API, se recomienda aprender y dominar esta poderosa herramienta lo antes posible y aplicarla a su proyecto para mejorar la eficiencia del desarrollo y la calidad del código.