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

Ser*_*Cat 19 java guava java-8 java-stream

我在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(","))
Run Code Online (Sandbox Code Playgroud)

如您所见!String.isNullOrEmpty(entity),过滤器函数中有一个语句.

我不想再在项目中使用Guava了,所以我只想简单地将其替换为:

string == null || string.length() == 0;
Run Code Online (Sandbox Code Playgroud)

我怎么能更优雅呢?

lcz*_*ski 22

在 java 11 中有一个新方法Predicate::not。

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

list.stream()
  .filter(Objects::nonNull)
  .filter(Predicate.not(String::isEmpty))
Run Code Online (Sandbox Code Playgroud)


fge*_*fge 18

你可以编写自己的谓词:

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

然后valueNotNullOrEmpty用作过滤器参数.

  • 你在`entrySet().stream()`上调用`filter(...)`,因此它需要一个`Predicate <Map.Entry <... >>`.点.显然,复制你的问题的代码无论如何都无法编译,因为甚至没有"map"的定义.如果你将你在图片主机上发布的代码与你在问题中发布的代码进行比较,你会注意到这里缺少的小`getValue()`调用,这会产生很大的不同.你刚才没有做正确的复制和粘贴. (4认同)
  • @ServerSideCat,你的截图有`isNullOrEmpty(entity.getValue())`而在你的问题中它只是`isNullOrEmpty(entity)`. (4认同)
  • 那么你在你的问题中展示了真实的代码呢?正如我所说,当前的代码提取只是不会编译 (3认同)
  • 图像不会显示给我; 你可以随心所欲地找到OMG,这是一个事实:你在问题中发布的代码将无法编译. (3认同)
  • @ServerSideCat:不,我们不能.我们是*程序员*.我们的工作基于事实,比如`Map.Entry`不是`String`.我们不能接受声称在其他方面起作用的代码,因为你说"我看到它正常工作".因为它不是看它而是*了解*正在发生什么.如果您理解了这一点,那么您就可以找到所有内容,以及不匹配的地方.当显然错误的代码看起来有效时,它会让你感到紧张,特别是当它是生产代码时. (3认同)

小智 15

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

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

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

this.stringList.stream().filter(StringUtils::isNotBlank);
Run Code Online (Sandbox Code Playgroud)

或作为lambdas:

this.stringList.stream().filter(s -> StringUtils.isNotBlank(s));
Run Code Online (Sandbox Code Playgroud)


Oli*_*ire 7

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

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

然后在你的代码中:

.filter(Strings::isNotNullOrEmpty)
Run Code Online (Sandbox Code Playgroud)

但正如@fge所提到的,你不能在Map.Entry<?,?>... 上使用它