uso predicados method ejemplos java java-8 guava java-stream

predicados - predicate list java



Java 8 Stream String Null O Empty Filter (5)

Funciona para mí: list.stream().filter(el-> el != null && !el.toString().trim().isEmpty()).collect(Collectors.toList());

Tengo Google Guava dentro de Stream:

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

Como ve, hay una declaración !String.isNullOrEmpty(entity) dentro de la función de filtro.

No quiero usar Guava más en el proyecto, así que solo quiero reemplazarlo simplemente por:

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

¿Cómo puedo hacerlo más elegante?


Puedes crear tu propia clase de Strings con tu propio predicado:

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

Luego en tu código:

.filter(Strings::isNotNullOrEmpty)

Pero como mencionó @fge, no puedes usar eso en un Map.Entry<?,?> ...


Puedes dividir el filtro en dos pasos:

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 una nota lateral, la mayoría de las implementaciones de Map.Entry.toString() hacen exactamente lo que estás haciendo en map() , por lo que teóricamente solo podrías hacer map(Map.Entry::toString) . Pero no confiaría en eso a menos que esté produciendo un toString() o algo que no requiera un comportamiento documentado o determinista.

Además, sé que quieres abandonar Guava, pero aquí hay una solución que podría hacerte reconsiderar:

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


Puedes escribir tu propio predicado:

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

Luego, simplemente use valueNotNullOrEmpty como su argumento de filtro.


Si prefiere usar commons-lang3, StringUtils tiene

  • isEmpty()
  • isNotEmpty()
  • isBlank()
  • isNotBlank()

Estos métodos pueden usarse en filtros como referencias de métodos:

this.stringList.stream().filter(StringUtils::isNotBlank);

o como lambdas:

this.stringList.stream().filter(s -> StringUtils.isNotBlank(s));