2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Java 8 introduit de nombreuses nouvelles fonctionnalités, dont les plus notables sont les expressions Lambda et l'API Stream. L'API Stream fournit une méthode efficace et concise pour traiter les données de collecte, rendant le code plus concis et clair, et offre une lisibilité et une maintenabilité élevées. Cet article approfondira l'utilisation de l'API Java Stream, y compris les concepts de base, les opérations courantes, le traitement parallèle, les cas pratiques et les meilleures pratiques.
L'API Stream est une abstraction introduite dans Java 8 pour le traitement des données de collecte qui permet de traiter les données de manière déclarative (similaire aux instructions SQL). L'API Stream fournit de nombreuses opérations puissantes qui peuvent être utilisées pour filtrer, trier, mapper, réduire et d'autres opérations sur les collections, simplifiant considérablement le code.
L'API Stream propose diverses méthodes pour créer un flux. Les méthodes courantes sont les suivantes :
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);
Les opérations intermédiaires sont utilisées pour convertir Stream et sont évaluées paresseusement. Les opérations intermédiaires courantes sont les suivantes :
filter
: utilisé pour filtrer les éléments.Stream<String> stream = list.stream().filter(s -> s.startsWith("a"));
map
: Utilisé pour mapper chaque élément au résultat correspondant.Stream<String> stream = list.stream().map(String::toUpperCase);
flatMap
: Utilisé pour convertir chaque élément en Stream, puis le fusionner en un seul Stream.Stream<String> stream = list.stream().flatMap(s -> Stream.of(s.split("")));
distinct
: Utilisé pour supprimer les doublons.Stream<String> stream = list.stream().distinct();
sorted
: utilisé pour le tri.Stream<String> stream = list.stream().sorted();
peek
: Utilisé pour visualiser chaque élément pendant le traitement.Stream<String> stream = list.stream().peek(System.out::println);
Les opérations de terminal sont utilisées pour démarrer le calcul de Stream et générer des résultats. Les opérations de terminal courantes sont les suivantes :
forEach
: Effectuer une opération sur chaque élément.list.stream().forEach(System.out::println);
collect
: Convertir le flux en d'autres formulaires.List<String> result = list.stream().collect(Collectors.toList());
reduce
: Réduisez les éléments du Stream en une valeur.Optional<String> result = list.stream().reduce((s1, s2) -> s1 + s2);
toArray
: Convertir le flux en tableau.String[] array = list.stream().toArray(String[]::new);
count
: Comptez le nombre d'éléments.long count = list.stream().count();
anyMatch
、allMatch
、noneMatch
: Utilisé pour faire correspondre le jugement.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
: Utilisé pour rechercher des éléments.Optional<String> first = list.stream().findFirst();
Optional<String> any = list.stream().findAny();
utilisersorted
La méthode trie le Stream et peut passer dans un comparateur.
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());
utiliserfilter
Méthode pour filtrer les éléments dans Stream.
List<String> list = Arrays.asList("a", "b", "c");
List<String> filteredList = list.stream().filter(s -> s.startsWith("a")).collect(Collectors.toList());
utilisermap
La méthode mappe les éléments du Stream.
List<String> list = Arrays.asList("a", "b", "c");
List<String> mappedList = list.stream().map(String::toUpperCase).collect(Collectors.toList());
utiliserreduce
Méthode pour réduire les éléments du Stream.
List<String> list = Arrays.asList("a", "b", "c");
String result = list.stream().reduce("", (s1, s2) -> s1 + s2);
utilisercollect
Les méthodes convertissent Stream en d’autres formes.
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 peut exploiter pleinement les avantages des processeurs multicœurs pour améliorer l'efficacité du traitement des données.peut utiliserparallelStream
La méthode crée un flux parallèle.
List<String> list = Arrays.asList("a", "b", "c");
List<String> parallelList = list.parallelStream().map(String::toUpperCase).collect(Collectors.toList());
Peut également être utiliséparallel
La méthode convertit un Stream normal en Stream parallèle.
List<String> list = Arrays.asList("a", "b", "c");
List<String> parallelList = list.stream().parallel().map(String::toUpperCase).collect(Collectors.toList());
Il convient de noter que le flux parallèle n'est pas toujours plus rapide que le flux série et qu'il doit être testé en fonction de la situation spécifique.
Étant donné une collection de chaînes, filtrez les chaînes dont la longueur est inférieure à 3 et convertissez les chaînes restantes en majuscules.
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]
Étant donné un ensemble d’entiers, calculez la moyenne de tous les entiers.
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
Utilisation de l'API Stream
Lisez le contenu du fichier et affichez-le sur la console.
try (Stream<String> lines = Files.lines(Paths.get("example.txt"))) {
lines.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
Lisez le contenu du fichier et comptez le nombre d'occurrences de chaque mot.
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();
}
Disons que nous avons une table de base de donnéesusers
, contenant des champsid
、name
etage
. Nous pouvons utiliser l'API Stream pour traiter les résultats de la requête.
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 classe propose une variété de collectionneurs et vous pouvez choisir le collectionneur approprié en fonction de vos besoins spécifiques.Une fois qu'un Stream est consommé, il ne peut plus être utilisé. Si vous devez le réutiliser, vous pouvez envisager de convertir le Stream en collection avant de l'utiliser.
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
stream.forEach(System.out::println);
stream.forEach(System.out::println); // 会抛出IllegalStateException
Les flux parallèles ne sont pas toujours plus rapides que les flux série et doivent être testés au cas par cas.peut utiliserForkJoinPool
Pour optimiser les performances du flux parallèle.
ForkJoinPool customThreadPool = new ForkJoinPool(4);
customThreadPool.submit(() ->
list.parallelStream().forEach(System.out::println)
).get();
Lorsque vous utilisez l'API Stream pour traiter de grandes quantités de données, vous devez faire attention au problème des fuites de mémoire.peut utiliserclose
méthode pour fermer le Stream, ou utilisertry-with-resources
L'instruction ferme automatiquement le Stream.
try (Stream<String> lines = Files.lines(Paths.get("example.txt"))) {
lines.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
Cet article présente en détail l'utilisation de l'API Java Stream, y compris les opérations de base, les opérations avancées, le traitement parallèle, les cas pratiques et les meilleures pratiques. En utilisant rationnellement l'API Stream, les développeurs peuvent considérablement simplifier le code, améliorer la lisibilité et la maintenabilité du code, ainsi que l'efficacité du traitement des données. J'espère que cet article vous sera utile pour votre utilisation de l'API Stream dans le développement Java.
L'API Java Stream est un outil puissant pour traiter les données de collecte. Grâce à l'utilisation flexible de diverses opérations, un traitement efficace des données et un calcul en continu peuvent être obtenus. Si vous n'avez pas encore utilisé l'API Stream, il est recommandé d'apprendre et de maîtriser cet outil puissant dès que possible et de l'appliquer à votre projet pour améliorer l'efficacité du développement et la qualité du code.