English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutoriel de base Java

Java 流程控制

Java 数组

Java 面向对象(I)

Java 面向对象(II)

Java 面向对象(III)

Gestion des exceptions Java

Java 列表(List)

Java Queue(队列)

Java Map集合

Java Set集合

Java 输入输出(I/O)

Java Reader/Writer

Autres sujets Java

Java 8 Stream

Java 8 New features

Java 8 L'API ajoute une nouvelle abstraction appelée Stream, qui vous permet de traiter les données de manière déclarative.

Stream fournit une abstraction de haut niveau pour les opérations et les expressions sur les collections Java, de manière intuitive, similaire à l'utilisation de requêtes SQL pour interroger une base de données.

L'API Stream peut grandement améliorer la productivité des développeurs Java, leur permettant d'écrire du code efficace, propre et concis.

Ce style considère l'ensemble des éléments à traiter comme un flux, qui est传输 dans les tuyaux et peut être traité aux nœuds des tuyaux, par exemple, filtrage, tri, agrégation, etc.

元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。

+--------------------+       +------+   +------+   +---+   +-------+
Les flux d'éléments passent par le traitement des opérations intermédiaires (intermediate operation) dans le pipeline, pour obtenir finalement le résultat traité par l'opération finale (terminal operation). +-----| stream of elements+-> |filter|+-> |sorted|+-> |map|
+--------------------+       +------+   +------+   +---+   +-------+

> |collect|

Le flux suivant peut être converti en code Java : 
List<Integer> transactionsIds =
             widgets.stream() -.filter(b
             > b.getColor() == RED) -.sorted((x,y) - > x.getWeight()
             y.getWeight())
             .mapToInt(Widget::getWeight)

.sum();

Qu'est-ce que Stream ?

  • Stream (flux) est une file d'éléments provenant d'une source de données et prend en charge les opérations d'agrégation File d'éléments

  • Les éléments sont des objets de type spécifique, formant une file. Java Stream ne stocke pas les éléments, mais les calcule à la demande. Source de données/O channel, generateur, etc. Les sources de flux. Cela peut être une collection, un tableau, un I

  • Opérations d'agrégation Des opérations similaires à des requêtes SQL, telles que filter, map, reduce, find, match, sorted, etc.

Contrairement aux opérations Collection précédentes, les opérations Stream ont deux caractéristiques de base :

  • Pipelining: Les opérations intermédiaires retournent toujours l'objet flux. De cette manière, plusieurs opérations peuvent être chaînées en une pipeline, comme dans le style fluide (fluent style). Cela permet d'optimiser les opérations, par exemple l'exécution différée (laziness) et le court-circuit ( short-circuiting).

  • Itération interne: Avant, la traversée des collections était toujours effectuée par Iterator ou For-De manière Each, itérer explicitement en dehors de la collection, ce qui s'appelle l'itération externe. Stream propose une méthode d'itération interne, réalisée par le modèle Visitor (visiteur).

Générer un flux

En Java 8 Dans ce contexte, l'interface de collection possède deux méthodes pour générer un flux :

  • stream() − Créer un flux séquentiel pour l'ensemble.

  • parallelStream()  − Créer un flux parallèle pour l'ensemble.

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

forEach

Stream propose une nouvelle méthode 'forEach' pour itérer chaque élément du flux. Le fragment de code suivant utilise forEach pour afficher10个随机数:

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

map

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 方法用于通过设置的条件过滤出元素。以下代码片段使用 filter 方法过滤出空字符串:

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

limit

limit 方法用于获取指定数量的流。 以下代码片段使用 limit 方法打印出 10 条数据:

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

sorted

sorted 方法用于对流进行排序。以下代码片段使用 sorted 方法对输出的 10 个随机数进行排序:

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

并行(parallel)程序

parallelStream 是流并行处理程序的代替方法。以下示例我们使用 parallelStream 来输出空字符串的数量:

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

我们可以很容易的在顺序运行和并行直接切换。

Collectors

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("Chaîne mélangée: " + mergedString);

Statistiques

De plus, certains collecteurs générant des statistiques sont très utiles. Ils sont principalement utilisés pour les types de base comme int, double, long, etc., et peuvent être utilisés pour générer des statistiques similaires à ce qui suit.

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
 
IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();
 
System.out.println("Le plus grand nombre de la liste: "); + stats.getMax());
System.out.println("Le plus petit nombre de la liste: "); + stats.getMin());
System.out.println("Somme de tous les nombres: "); + stats.getSum());
System.out.println("Moyenne: "); + stats.getAverage());

Exemple complet de Stream

Insérer le code suivant dans Java8Dans le fichier 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("Utilisation de Java 7: ");
        
      // Calculer le nombre de chaînes vides
      List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl");
      System.out.println("列表: " +strings);
      long count = getCountEmptyStringUsingJava7(strings);
        
      System.out.println("Nombre de caractères vides: ") + count);
      count = getCountLength2UsingJava7(strings);
        
      System.out.println("Longueur des chaînes: " 3 的数量为: " + count);
        
      // Supprimer les chaînes vides
      List<String> filtered = deleteEmptyStringsUsingJava7(strings);
      System.out.println("Liste filtrée: " + filtered);
        
      // Supprimer les chaînes vides et les joindre avec des virgules
      String mergedString = getMergedStringUsingJava7(strings, ", ");
      System.out.println("Chaîne mélangée: " + mergedString);
      List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
        
      // Obtenir les nombres carrés de la liste
      List<Integer> squaresList = getSquares(numbers);
      System.out.println("Liste des nombres carrés: " + squaresList);
      List<Integer> integers = Arrays.asList(1,2,13,4,15,6,17,8,19);
        
      System.out.println("列表: " +integers);
      System.out.println("Le plus grand nombre de la liste: "); + getMax(integers));
      System.out.println("Le plus petit nombre de la liste: "); + getMin(integers));
      System.out.println("Somme de tous les nombres: "); + getSum(integers));
      System.out.println("Moyenne: "); + getAverage(integers));
      System.out.println("Nombre aléatoire: ");
        
      // sortie10de nombres aléatoires
      Random random = new Random();
        
      for(int i=0; i < 10; i++{
         System.out.println(random.nextInt());
      }
        
      System.out.println("Utilisation de Java 8: ");
      System.out.println("列表: " +strings);
        
      count = strings.stream().filter(string->string.isEmpty()).count();
      System.out.println("Nombre de chaînes vides: " + count);
        
      count = strings.stream().filter(string -> string.length() == 3).count();
      System.out.println("Longueur des chaînes: " 3 的数量为: " + count);
        
      filtered = strings.stream().filter(string -!string.isEmpty()).collect(Collectors.toList()));
      System.out.println("Liste filtrée: " + filtered);
        
      mergedString = strings.stream().filter(string -!string.isEmpty()).collect(Collectors.joining(", ")));
      System.out.println("Chaîne mélangée: " + mergedString);
        
      squaresList = numbers.stream().map( i ->i*i).distinct().collect(Collectors.toList()));
      System.out.println("Carrés de la liste: " + squaresList);
      System.out.println("列表: " +integers);
        
      IntSummaryStatistics stats = integers.stream().mapToInt((x) ->x).summaryStatistics();
        
      System.out.println("Le plus grand nombre de la liste: "); + stats.getMax());
      System.out.println("Le plus petit nombre de la liste: "); + stats.getMin());
      System.out.println("Somme de tous les nombres: "); + stats.getSum());
      System.out.println("Moyenne: "); + stats.getAverage());
      System.out.println("Nombre aléatoire: ");
        
      random.ints().limit(10).sorted().forEach(System.out::println);
        
      // traitement parallèle
      count = strings.parallelStream().filter(string -> string.isEmpty()).count();
      System.out.println("Le nombre de chaînes vides est de: "); + 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 somme = (int)(numbers.get(0));
        
      for(int i=1;i < numbers.size();i++{
         somme +=(int)numbers.get(i);
      }
      return sum;
   }
    
   private static int getAverage(List<Integer> numbers){
      return getSum(numbers); / numbers.size();
   }
}

Execute the above script, the output result is:

$ javac Java8Tester.java 
$ java Java8Tester
Using Java 7: 
List: [abc, , bc, efg, abcd, , jkl]
The number of empty characters is: 2
String length is 3 The number of: 3
Filtered list: [abc, bc, efg, abcd, jkl]
Merge strings: abc, bc, efg, abcd, jkl
Square numbers list:9, 4, 49, 25]
List:1, 2, 13, 4, 15, 6, 17, 8, 19]
The largest number in the list: 19
The smallest number in the list: 1
Sum of all numbers: 85
Average number: 9
Random number: 
-393170844
-963842252
447036679
-1043163142
-881079698
221586850
-1101570113
576190039
-1045184578
1647841045
Using Java 8: 
List: [abc, , bc, efg, abcd, , jkl]
The number of empty strings is: 2
String length is 3 The number of: 3
Filtered list: [abc, bc, efg, abcd, jkl]
Merge strings: abc, bc, efg, abcd, jkl
Squares List:9, 4, 49, 25]
List:1, 2, 13, 4, 15, 6, 17, 8, 19]
The largest number in the list: 19
The smallest number in the list: 1
Sum of all numbers: 85
Average number: 9.444444444444445
Random number: 
-1743813696
-1301974944
-1299484995
-779981186
136544902
555792023
1243315896
1264920849
1472077135
1706423674
The number of empty strings is: 2

Java 8 New features