Java 8 流字符串 Null 或空过滤器

Java 8 Stream String Null Or Empty Filter

我在 Stream 中有 Google Guava:

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;

怎样才能更优雅呢?

您可以使用自己的谓词创建自己的 Strings class:

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

然后在你的代码中:

.filter(Strings::isNotNullOrEmpty)

但是正如@fge 提到的那样,您不能在 Map.Entry<?,?>...

上使用它

您可以编写自己的谓词:

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

然后只需使用 valueNotNullOrEmpty 作为您的过滤器参数。

如果您更喜欢使用 commons-lang3,StringUtils 有

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

这些方法可以在过滤器中用作方法参考:

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

或作为 lambda:

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

您可以将过滤器分解为两个步骤:

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

对我有用:list.stream().filter(el-> el != null && !el.toString().trim().isEmpty()).collect(Collectors.toList());

在java11中有一个新方法Predicate::not

所以你可以过滤掉空字符串:

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