J'essaie d'en savoir plus sur les flux et j'ai rencontré un problème: Je souhaite obtenir la valeur minimale d'une liste et l'assigner à une variable int Pour cela, j'ai effectué les opérations suivantes:
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
int smallest = list.stream().min(Integer::compareTo).get();
System.out.println(smallest);
Cela fonctionne bien et je reçois 1
en conséquence . Le problème est que le IDE donne l’avertissement que Optional.get
est appelé avant la vérification de .isPresent
. Pour résoudre ce problème j’ai utilisé la méthode ifPresent
légèrement différente et essayé le suivant:
int smallest = list.stream().min(Integer::compareTo).ifPresent(integer -> integer);
Malheureusement, cela ne fonctionne pas car j'obtiens l'avertissement suivant: Bad return type in Lambda, Integer cannot be converted to void.
Mon question est finalement: Comment puis-je affecter la valeur minimale à la variable int smallest
AVEC vérifiant si est présent?
Stream#min
return Optional
of result car en règle générale, le flux peut être vide, il ne peut donc y avoir de valeur minimale.
Optional<Integer> minimal = list.stream().min(Integer::compareTo);
Pour obtenir de la valeur de Optional, vous devez avoir une valeur de repli
Integer absent = Integer.MIN_VALUE;
Le plus simple serait d'utiliser orElse
Integer smallest = minimal.orElse(absent);
Un peu plus longtemps serait isPresent
Integer smallest = minimal.isPresent() ? minimal.get() : absent;
Voici comment je le ferais:
package lambdas;
import Java.util.ArrayList;
import Java.util.List;
/**
* Created by Michael
* Creation date 7/31/2016.
* @link https://stackoverflow.com/questions/38688119/Java-8-streams-ifpresent
*/
public class MinimumExample {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
int smallest = list.stream().min(Integer::compareTo).orElse(Integer.MIN_VALUE);
System.out.println(smallest);
}
}
La méthode ifPresent
prend Consumer<? super T>
en tant que paramètre. En termes simples, cela devrait être une action sans déclaration return
. Vous pouvez imprimer la valeur si elle est présente, comme
[...].ifPresent(System.out::print);
Mais ce n'est pas ce que dit IDEA. Je pense que vous devez simplement enregistrer une instance Option<Integer>
puis la vérifier par isPresent
Optional<Integer> o = list.stream().min(Integer::compareTo);
if (o.isPresent()) {
smallest = o.get();
}
Bien sûr, il existe des méthodes plus pratiques avec orElse
:
smallest = o.orElse(Integer.MIN_VALUE);
ou avec l'opérateur ternaire:
smallest = o.isPresent() ? o.get() : Integer.MIN_VALUE;