web-dev-qa-db-fra.com

Flux Java 8 "si présent"

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?

8
Stefan B

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;
6
Nazarii Bardiuk

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);
    }
}
7
duffymo

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;
1
Andrew Tobilko