J'ai un double[]
et je veux filtrer (créer un nouveau tableau sans) les valeurs négatives dans une ligne sans ajouter de boucles for
. Est-ce possible d'utiliser Java 8 expressions lambda?
Dans python ce serait ceci en utilisant des générateurs:
[i for i in x if i > 0]
Est-il possible de faire quelque chose d'aussi concis dans Java 8?
Oui, vous pouvez le faire en créant un DoubleStream
à partir du tableau, en filtrant les négatifs et en reconvertissant le flux en tableau. Voici un exemple:
double[] d = {8, 7, -6, 5, -4};
d = Arrays.stream(d).filter(x -> x > 0).toArray();
//d => [8, 7, 5]
Si vous voulez filtrer un tableau de référence qui n'est pas un Object[]
vous devrez utiliser la méthode toArray
qui utilise un IntFunction
pour obtenir un tableau du type original comme résultat:
String[] a = { "s", "", "1", "", "" };
a = Arrays.stream(a).filter(s -> !s.isEmpty()).toArray(String[]::new);
encore plus simple, en ajoutant jusqu'à String[]
,
utiliser le filtre intégré filter(StringUtils::isNotEmpty)
de org.Apache.commons.lang3
import org.Apache.commons.lang3.StringUtils;
String test = "a\nb\n\nc\n";
String[] lines = test.split("\\n", -1);
String[] result = Arrays.stream(lines).filter(StringUtils::isNotEmpty).toArray(String[]::new);
System.out.println(Arrays.toString(lines));
System.out.println(Arrays.toString(result));
et sortie: [a, b, , c, ] [a, b, c]