it-swarm.com.de

Java 8 Stream String Null oder leerer Filter

Ich habe Google Guava in Stream:

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

Wie Sie sehen, gibt es in der Filterfunktion eine Anweisung !String.isNullOrEmpty(entity).

Ich möchte Guava nicht mehr im Projekt verwenden, also möchte ich es einfach ersetzen durch:

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

Wie kann ich es eleganter machen? 

16
ServerSideCat

Sie können Ihr eigenes Prädikat schreiben:

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

Dann verwenden Sie einfach valueNotNullOrEmpty als Filterargument.

15
fge

Wenn Sie commons-lang3 bevorzugen, hat StringUtils

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

Diese Methoden können in Filtern als Methodenreferenzen verwendet werden:

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

oder als Lambdas:

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

Sie können Ihre eigene Strings-Klasse mit Ihrem eigenen Prädikat erstellen:

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

Dann in Ihrem Code:

.filter(Strings::isNotNullOrEmpty)

Aber wie @fge erwähnt, kann man das nicht für einen Map.Entry<?,?>... verwenden.

6

Sie können den Filter in zwei Schritte unterteilen:

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(","))

Nebenbei bemerkt, die meisten Map.Entry.toString()-Implementierungen tun genau das, was Sie in map() tun, also könnten Sie theoretisch einfach map(Map.Entry::toString) tun. Aber ich würde mich nicht darauf verlassen, es sei denn, Sie produzieren eine toString() oder etwas, das kein dokumentiertes oder deterministisches Verhalten erfordert.

Ich weiß auch, dass Sie Guava aufgeben wollen, aber hier ist eine Lösung, die Sie vielleicht erneut überdenken könnte:

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

Es funktioniert für mich: list.stream().filter(el-> el != null && !el.toString().trim().isEmpty()).collect(Collectors.toList());

0
Taras Melnyk

In Java 11 gibt es eine neue Methode Predicate :: not .

So können Sie leere Zeichenketten herausfiltern:

list.stream()
        .filter(Objects::nonNull)
        .filter(Predicate.not(String::isEmpty))
0
lczapski