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

时间:2015-07-13 10:21:13

标签: java java-8 guava 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(","))

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

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

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

我怎样才能更优雅?

6 个答案:

答案 0 :(得分:17)

您可以编写自己的谓词:

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

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

答案 1 :(得分:13)

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

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

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

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

或作为lambdas:

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

答案 2 :(得分:6)

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

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

然后在你的代码中:

.filter(Strings::isNotNullOrEmpty)

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

答案 3 :(得分:3)

在Java 11中,有一个新方法Predicate::not

因此您可以过滤出空字符串:

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

答案 4 :(得分:2)

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

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()或者不需要记录或确定性行为的事情,否则我不会依赖它。

另外,我知道你想放弃番石榴,但这里有一个可能让你重新考虑的解决方案:

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

答案 5 :(得分:0)

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