web-dev-qa-db-fra.com

Filtre nul ou vide pour chaîne de flux Java 8

J'ai Google Guava dans Stream:

this.map.entrySet().stream()
.filter(entity -> !Strings.isNullOrEmpty(entity.getValue()))
.map(obj -> String.format("%s=%s", obj.getKey(), obj.getValue()))
.collect(Collectors.joining(","))

Comme vous le voyez, il existe une déclaration !String.isNullOrEmpty(entity) dans la fonction de filtrage.

Je ne veux plus utiliser de goyave dans le projet, je souhaite simplement le remplacer simplement par:

string == null || string.length() == 0;

Comment puis-je le faire plus élégant? 

16
ServerSideCat

Vous pouvez écrire votre propre prédicat:

final Predicate<Map.Entry<?, String>> valueNotNullOrEmpty
    = e -> e.getValue() != null && !e.getValue().isEmpty();

Ensuite, utilisez simplement valueNotNullOrEmpty comme argument de filtre.

15
fge

Vous pouvez créer votre propre classe Strings avec votre propre prédicat:

public class Strings {
  public static boolean isNotNullOrEmpty (String str) {
    return str != null && !str.isEmpty();
  }
}

Puis dans votre code:

.filter(Strings::isNotNullOrEmpty)

Mais comme @fge mentionné, vous ne pouvez pas utiliser cela sur un Map.Entry<?,?>...

6
Olivier Grégoire

Vous pouvez décomposer le filtre en deux étapes:

this.map.entrySet().stream()
    .filter(entity -> entity.getValue() != null)
    .filter(entity -> !entity.getValue().isEmpty())
    .map(obj -> String.format("%s=%s", obj.getKey(), obj.getValue()))
    .collect(Collectors.joining(","))

En passant, la plupart des implémentations de Map.Entry.toString() font exactement ce que vous faites dans map(). Vous pouvez donc théoriquement simplement faire map(Map.Entry::toString). Mais je ne me fierais pas à cela sauf si vous produisez une toString() ou quelque chose qui n'exige pas un comportement documenté ou déterministe.

De plus, je sais que vous souhaitez abandonner Guava, mais voici une solution qui pourrait vous inciter à reconsidérer:

Joiner.on(',').withKeyValueSeparator("=")
      .join(Maps.filterValues(map, Predicates.not(Strings::isNullOrEmpty)));
1
shmosel

Cela fonctionne pour moi: list.stream().filter(el-> el != null && !el.toString().trim().isEmpty()).collect(Collectors.toList());

0
Taras Melnyk