web-dev-qa-db-fra.com

Java 8 Matrice de filtres utilisant Lambda

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?

55
Makoto

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);
97
Alex

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]

1
keypoint