1. Vérification

Je pense que vous vous ennuyez peut-être déjà à apprendre à enchaîner des flux de données. Vous voulez enfin faire quelque chose avec les données.

La Streamclasse a trois méthodes standard qui ne construisent pas de flux, mais vérifient à la place le type de données qu'ils contiennent. Ces méthodes sont : anyMatch(), allMatch(), et noneMatch().

boolean anyMatch(rule)méthode

Cette méthode vérifie si le flux contient au moins un élément qui satisfait la règle transmise à la méthode. S'il existe un tel élément, la méthode retourne true, sinon false.

Exemples

Code Note
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
boolean result = stream.anyMatch(x -> x > 0);

true
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.anyMatch(x -> x > 0);

true
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.filter(x -> x < 0).anyMatch(x -> x > 0);

false

Dans le dernier exemple, nous ne retenons d'abord que les éléments inférieurs à zéro, puis nous vérifions le résultat pour voir si l'un des éléments filtrés est supérieur à zéro. Bien sûr, de tels éléments ne sont plus là.

méthode booléenne allMatch(rule)

Cette méthode vérifie si tous les éléments du flux correspondent à la règle (également appelée prédicat). La règle est passée en argument à la méthode :

Code Note
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
boolean result = stream.allMatch(x -> x > 0);
true
(tous les éléments supérieurs à zéro)
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.allMatch(x -> x > 0);
false
(y a-t-il des éléments inférieurs ou égaux à zéro ?)
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.filter(x -> x < 0).allMatch(x -> x < 0);
true
(nous avons retenu les éléments inférieurs à zéro)

Dans le dernier exemple, nous n'autorisons d'abord que les éléments inférieurs à zéro à passer à travers le filtre, puis nous vérifions si tous les éléments retenus sont inférieurs à zéro. Le contrôle donne un résultat positif.

méthode booléenne noneMatch(rule)

La noneMatch()méthode vérifie si le flux ne contient aucun élément correspondant à la règle transmise. C'est comme le contraire de la anyMatch()méthode.

Code Note
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
boolean result = stream.noneMatch(x -> x > 0);

false
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.noneMatch(x -> x > 0);

false
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.filter(x -> x < 0).noneMatch(x -> x > 0);

true

4
Mission
Bases de Java,  niveau 6leçon 5
Bloqué
join : au bon endroit au bon moment
Demande-toi où et sur quel objet tu dois appeler la méthode join pour que le résultat s'affiche d'abord pour firstThread, puis pour secondThread. Appelle la méthode join au bon endroit. Exemple de sortie : firstThread : String 1 firstThread : String 2 ... firstThread : String 19 firstThread : S
18
Mission
Bases de Java,  niveau 6leçon 5
Bloqué
Course hippique
Détermine ce que fait le programme. Implémente la méthode calculateHorsesFinished. Elle doit : 1. Calculer et renvoyer le nombre de chevaux qui ont terminé. Utilise la méthode isFinished(). 2. Si un cheval n'a pas encore franchi la ligne d'arrivée (!isFinished()) , alors : 2.1. Affiche&nbs

2. Classes utilitaires : Optionalclasse

Parfois, il est très gênant pour les programmeurs de travailler avec nulldes références. Par exemple, supposons que vous compariez deux chaînes. Si les deux variables ne sont pas null, vous pouvez simplement appeler s1.equals(s2), et tout fonctionnera. Mais si s1c'est possible null, alors vous devez écrire du code qui gère cette situation afin d'éviter un NullPointerException.

C'est pourquoi les programmeurs ont créé la Optional<T>classe utilitaire. Son code ressemble à peu près à ceci :

Code Note
class Optional<Type>
{
   private final Type value;
   private Optional() { this.value = null;}
   private Optional(value) { this.value = value;}
   public static <Type> Optional<Type> of(Type value)
   {
      return new Optional<Type>(value);
   }

   public boolean isPresent()
   {
      return value != null;
   }

   public boolean isEmpty()
   {
      return value == null;
   }

   public Type get()
   {
      if (value == null)
      {
         throw new NoSuchElementException();
      }
      return value;
   }

   public Type orElse(Type other)
   {
      return value != null ? value : other;
   }

   public Type orElseThrow()
   {
      if (value == null)
      {
         throw new NoSuchElementException();
      }
      return value;
   }
}










Vérifie si la valeur n'est pas null



Vérifie si la valeur est null




Renvoie la valeur stockée. Lève une exception si la valeur est nulle.







Renvoie la valeur non nulle stockée. Ou si la valeur stockée est null, alors renvoie la valeur transmise en tant qu'argument de méthode.



Renvoie la valeur non nulle stockée ou lève une exception si la valeur est nulle.

Le but de cette classe est simplement de stocker un objet T (une référence à un objet dont le type est T). La référence d'objet à l'intérieur d'un Optional<T>objet peut être null.

Cette classe permet aux programmeurs d'écrire un code légèrement plus joli. Comparons:

Utilisation facultative Ne pas utiliser Facultatif
public void printString(String s)
{
   Optional<String> str = Optional.ofNullable(s);
   System.out.println(str.orElse(""));
}
public void printString(String s)
{
   String str = s != null ? s : "";
   System.out.println(str)
}

Un Optionalobjet peut toujours être comparé à un autre Optionalobjet à l'aide de la equalsméthode, même s'ils stockent nulldes références.

En termes simples, la Optionalclasse vous permet d'écrire de "belles" vérifications nullet de "belles" actions dans le cas où un Optionalobjet stocke une nullvaleur.


9
Mission
Bases de Java,  niveau 6leçon 5
Bloqué
Promotion lors des débats politiques
1. Détermine ce que fait le programme. 2. Nous devons nous assurer que Chump parle le plus au cours du débat politique. 3. Demande-toi quelle méthode tu peux appeler sur l'objet chump pour que Chump parle jusqu'à ce que tout le temps disponible ait été pris.

3. Trouver des éléments

Revenons à la Streamclasse. La Streamclasse a 4 méthodes supplémentaires qui vous permettent de rechercher des éléments dans un flux. Ces méthodes sont findFirst(), findAny(), min()et max().

Optional<T> findFirst()méthode

La findFirst()méthode renvoie simplement le premier élément du flux. C'est tout ce qu'il fait.

La chose la plus intéressante à noter ici est que la méthode ne renvoie pas un Tobjet, mais plutôt un Optional<T>objet wrapper. Cela garantit que la méthode ne reviendra jamais nullaprès avoir échoué à trouver un objet.

Exemple:

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String str = list.stream().findFirst().get(); // Hello

Pour plus de clarté, divisons la dernière ligne en plusieurs lignes :

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");

Stream<String> stream = list.stream();
Optional<String> result = stream.findFirst();
String str = result.get(); // Hello

La dernière get()méthode consiste simplement à récupérer la valeur stockée à l'intérieur de l' Optionalobjet.

Optional<T> findAny()méthode

La findAny()méthode renvoie n'importe quel élément du flux et s'arrête là. Cette méthode est similaire à findFirst(), mais elle est idéale pour les flux utilisés dans des opérations parallèles.

Lors du traitement de flux en parallèle, il se peut qu'un élément ait déjà été trouvé dans une partie d'un flux, mais il n'est pas encore clair s'il s'agit du premier ou non.

Si de nombreux éléments correspondent à tous les filtres et qu'il est important pour le programmeur d'obtenir exactement le premier d'entre eux, la findFirst()méthode est ce qu'il convient d'appeler. Si le programmeur sait qu'en réalité 0 ou 1 élément correspondra à tous les filtres, il suffit alors d'appeler simplement findAny()- et ce sera plus rapide.

Optional<T> min(Comparator<T>)méthode

La min()méthode utilise un comparatorobjet pour comparer tous les éléments du flux et renvoie l'élément minimum. Le moyen le plus pratique de définir un objet comparateur consiste à utiliser une fonction lambda.

Exemple de recherche de la chaîne la plus courte :

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String min = list.stream().min( (s1, s2)-> s1.length()-s2.length() ).get();

Optional<T> max(Comparator<T>)méthode

La max()méthode utilise un comparatorobjet pour comparer tous les éléments du flux et renvoie l'élément maximum. Le moyen le plus pratique de définir un objet comparateur consiste à utiliser une fonction lambda.

Exemple de recherche de la chaîne la plus longue :

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String max = list.stream().max( (s1, s2)-> s1.length()-s2.length() ).get();
4
Mission
Bases de Java,  niveau 6leçon 5
Bloqué
Justice
1. Détermine ce que fait le programme. 2. Vérifie que toutes les souris mangent en même temps. 3. Demande-toi quelle méthode permet à la souris mâle alpha de manger d'abord, pendant que l'autre attend. 4. Supprime l'appel à cette méthode.
9
Mission
Bases de Java,  niveau 6leçon 5
Bloqué
Organiser les appels à join()
1. Détermine ce que fait le programme. 2. Organise les appels à join() pour que chaque chat fasse ce qui suit : 2.1. D'abord, le chat donne naissance à des chatons. 2.2. Ensuite, tous les chatons sortent du panier dans un ordre aléatoire. 2.3. Enfin, le chat les ramène dans le panier. 2.4. Ces