2015-07-13 9 views
8

Ich habe Google Guava innen Stream:Java 8 Stream-String null oder leer Filter

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 eine Anweisung !String.isNullOrEmpty(entity) innerhalb der Filterfunktion.

Ich will nicht Guava mehr verwenden im Projekt, so möchte ich nur, sie ersetzen einfach durch:

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

Wie kann ich es elegantere tun?

+0

Verwendung StringUtils (Apache commons lang) oder 'Optional.ofNullable (string) .orElse ("") .length() == 0' – griFlo

+0

ich möchte Pure Java verwenden - ist es möglich, es hier zu tun? – ServerSideCat

+1

'Optional.ofNullable (string) .orElse (" "). Length() == 0' ist pure java – griFlo

Antwort

11

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.

+0

Prädikat in Java 8 sieht wie eine elegante Lösung aus. Allerdings kann ich Ihr Beispiel nicht in meinem Code verwenden, da wir Strings verwenden, anstatt mit Map.Entry zu arbeiten. Könnten Sie es optimieren? – ServerSideCat

+3

Was ist mit dir? Dann hast du den richtigen Code in deiner Frage gezeigt? Wie gesagt, der aktuelle Code-Extrakt wird nicht kompiliert – fge

+0

Haben Sie es versucht? :) – ServerSideCat

5

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 im Code:

.filter(Strings::isNotNullOrEmpty) 

Aber wie @fge erwähnt, kann man das nicht auf ein Map.Entry<?,?> verwenden ...

4

Wenn Sie es vorziehen commons-LANG3 zu verwenden, StringUtils hat

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

Diese Verfahren können in Filter als Methode Referenzen verwendet werden :

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

oder als Lambda-Ausdrücke:

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

Sie können die Filter in zwei Schritte aufgliedern:

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

Auf einer Seite zur Kenntnis, die meisten Map.Entry.toString() Implementierungen genau tun, was Sie tun in map(), so könnte man theoretisch einfach map(Map.Entry::toString) machen. Aber ich würde mich nicht darauf verlassen, es sei denn, Sie produzieren ein toString() oder etwas, das kein dokumentiertes oder deterministisches Verhalten erfordert.

Auch ich weiß, Sie Guava aufgeben wollen, aber hier ist eine Lösung, die Sie überdenken könnte machen:

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