2015-07-13 13 views
8

devo Google Guava all'interno Stream:Java 8 Streaming String nullo o vuoto Filtro

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

Come si vede v'è una dichiarazione !String.isNullOrEmpty(entity) all'interno della funzione di filtro.

Non voglio più utilizzare Guava nel progetto, quindi voglio solo sostituirlo semplicemente:

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

Come posso farlo più elegante?

+0

uso StringUtils (comuni apache lang) o 'Optional.ofNullable (stringa) .orElse ("") .length() == 0' – griFlo

+0

voglio usare Pure Java - è possibile farlo qui? – ServerSideCat

+1

'Optional.ofNullable (stringa) .orElse (" "). Length() == 0' è pure java – griFlo

risposta

11

È possibile scrivere un proprio predicato:

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

Quindi utilizzare solo valueNotNullOrEmpty come argomento del filtro.

+0

Predicate in Java 8 sembra una soluzione elegante. Tuttavia, non sono in grado di utilizzare il tuo esempio nel mio codice poiché stiamo utilizzando Strings invece di lavorare con Map.Entry . Potresti ottimizzarlo? – ServerSideCat

+3

E poi hai mostrato il vero codice nella tua domanda? Come ho già detto, l'attuale estratto del codice non verrà compilato – fge

+0

Hai provato? :) – ServerSideCat

5

È possibile creare il proprio Strings classe con il proprio predicato:

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

Poi nel codice:

.filter(Strings::isNotNullOrEmpty) 

Ma, come @fge menzionate, non è possibile utilizzare che su un Map.Entry<?,?> ...

4

Se si preferisce utilizzare commons-lang3, StringUtils ha

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

Questi metodi possono essere utilizzati in filtri come metodo di riferimento :

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

o come lambda:

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

È possibile abbattere il filtro in due fasi:

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

Una nota a parte, la maggior parte Map.Entry.toString() implementazioni fare esattamente quello che stanno facendo in map(), quindi in teoria potresti fare solo map(Map.Entry::toString). Ma non mi fiderei di questo a meno che non produciate uno toString() o qualcosa che non richieda un comportamento documentato o deterministico.

Inoltre, so che vuoi abbandonare Guava, ma qui è una soluzione che potrebbe farti riconsiderare:

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