Java 8流字符串空或空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; 

我怎么能更优雅呢?

你可以编写自己的谓词:

 final Predicate> valueNotNullOrEmpty = e -> e.getValue() != null && !e.getValue().isEmpty(); 

然后使用valueNotNullOrEmpty作为filter参数。

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

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

这些方法可以在filter中用作方法参考:

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

或作为lambdas:

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

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

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

然后在你的代码中:

 .filter(Strings::isNotNullOrEmpty) 

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

您可以将filter分为两个步骤:

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

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