web-dev-qa-db-fra.com

Java 8 - filtre la chaîne vide de la liste ne fonctionne pas

Je souhaite supprimer une chaîne vide de la liste des chaînes.

Voici ce que j'ai essayé en utilisant l'API de flux:

list.stream().filter(item-> !item.isEmpty()).collect(Collectors.toList());

et la chaîne vide est toujours présente dans la liste. Qu'est-ce que je rate ?

5
stackUnderflow

filter() keep les éléments qui correspondent au prédicat. Soyou a besoin du prédicat inverse:

list.stream().filter(item-> !item.isEmpty()).collect(Collectors.toList());

Cela ne modifiera pas non plus la liste d'origine. Cela créera une copie filtrée de la liste originale. Donc vous avez besoin

list = list.stream().filter(item-> !item.isEmpty()).collect(Collectors.toList());

Si vous souhaitez modifier la liste d'origine, vous devez utiliser

list.removeIf(item -> item.isEmpty());

ou simplement

list.removeIf(String::isEmpty);
17
JB Nizet

Je soupçonne que vous ne gardez pas le résultat. Le résultat est renvoyé, la liste d'origine n'est pas modifiée car il s'agit d'un style de programmation fonctionnel.

list = list.stream().filter(item-> !item.trim().isEmpty()).collect(Collectors.toList());
3
Peter Lawrey

Peut-être que la chaîne contient des espaces blancs? Remplacez item -> item.isEmpty() par item -> !item.trim().isEmpty()

2
Adam Siemion

vous collectez les éléments vides :)

vous voulez le pas vide afin d'inverser le prédicat

List<String> xxx = list.stream().filter(item -> !item.isEmpty()).collect(Collectors.toList());

de plus, le flux ne modifie pas la liste d'origine, donc Collect(Collectrors.toList()) renvoie le résultat du prédicat :)

     <dependency>
            <groupId>org.Apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.5-SNAPSHOT</version>
        </dependency>

import org.Apache.commons.lang3.StringUtils;
        //Java8 new api
        strings.removeIf(StringUtils::isBlank);
        //stream        strings=strings.stream().filter(StringUtils::isNotBlank).collect(Collectors.toList());
0
printfabcd

Peut-être que votre liste contient null. Donc, d'abord filtrer avec une vérification nulle , Puis filtrer à nouveau

    list.stream().filter(item -> null != item).filter(item -> !item.isEmpty()).collect(Collectors.toList());

Si vous avez Apache commons lang lib, utilisez Apache StringUtils isNotBlank.

list.stream().filter(item -> StrinUtils.isNotBlank(item)).collect(Collectors.toList());
0
Imran

Vous supprimez des chaînes non vides (vérifiez votre condition de filtre). Essayer:

list.stream().filter(item -> !item.isEmpty()).collect(Collectors.toList());

Sinon, vous devrez peut-être vérifier que vous supprimez également les blancs:

list.stream().filter(item -> !item.trim().isEmpty()).collect(Collectors.toList());
0
ernest_k

Vous ne supprimez pas les chaînes vides de la liste, vous les récupériez. Votre condition de filtre est fausse.

Essayez comme ça:

List<String> collect = list.stream().filter(item -> !item.trim().isEmpty()).collect(Collectors.toList());
0
Andrei Olar

vous pouvez suivre l'exemple ci-dessous, cela peut vous aider 

String[] firstArray = {"test1", "", "test2", "test4", "", null};

    firstArray = Arrays.stream(firstArray).filter(s -> (s != null && s.length() > 0)).toArray(String[]::new);
0
Sangram Badi