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