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());
- Java 8是否缓存了对供应商的支持?
- readResolve无法正常工作? :出现了一个Guava的SerializedForm实例
- Java Guava组合Multimap和Cache
- 如何扫描类注释?
- JUnit抛出java.lang.NoSuchMethodError对于com.google.common.collect.Iterables.tryFind
- 如何从java字符串中删除控制字符?
- NoSuchMethodError:com.google.common.base.Stopwatch.createStarted()Lcom / google / common / base / Stopwatch
- 如何在不改变equals和hashcode的情况下插入到set中
- java – google guava缓存invalidateAll()和cleanUp()之间的区别