2015-07-13 3 views
8

У меня есть Google Guava внутри Stream:Java 8 поток Строка Null или пустой фильтр

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

Как вы видите, есть заявление !String.isNullOrEmpty(entity) внутри функции фильтра.

Я больше не хочу использовать Guava в проекте, так что я просто хочу, чтобы заменить его просто:

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

Как я могу сделать это более изящным?

+0

использование StringUtils (Apache Commons Lang) или 'Optional.ofNullable (строка) .orElse ("") .length() == 0' – griFlo

+0

Я хочу использовать Pure Java - это можно сделать здесь? – ServerSideCat

+1

'Необязательный.ofNullable (string) .orElse (" "). Length() == 0' is pure java – griFlo

ответ

11

Вы можете написать собственный отзыв:

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

Затем просто используйте valueNotNullOrEmpty в качестве аргумента фильтра.

+0

Predicate's в Java 8 выглядит элегантным решением. Однако я не могу использовать ваш пример в своем коде, так как мы работаем со строками вместо работы с Map.Entry . Не могли бы вы его оптимизировать? – ServerSideCat

+3

Как насчет того, что вы показали настоящий код в своем вопросе? Как я уже сказал, текущий фрагмент кода просто не будет компилироваться – fge

+0

Вы пробовали? :) – ServerSideCat

5

Вы можете создать свой собственный класс Strings с собственным предиката:

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

Затем в коде:

.filter(Strings::isNotNullOrEmpty) 

Но, как @fge упоминалось, вы не можете использовать это на Map.Entry<?,?> ...

4

Если вы предпочитаете использовать Викисклада lang3, StringUtils имеет

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

Эти методы могут быть использованы в фильтрах в качестве ссылок метода :

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

или лямбды:

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

Вы можете сломать фильтр в два этапа:

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

На стороне записки, большинство Map.Entry.toString() реализации этого именно то, что вы делаете в map(), так что вы могли бы теоретически просто сделать map(Map.Entry::toString). Но я бы не стал полагаться на это, если вы не создаете toString() или что-то, что не требует документированного или детерминированного поведения.

Кроме того, я знаю, что вы хотите отказаться от Guava, но вот решение, которое может заставить вас пересмотреть:

Joiner.on(',').withKeyValueSeparator("=") 
     .join(Maps.filterValues(map, Predicates.not(Strings::isNullOrEmpty))); 
Смежные вопросы