我在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;
我怎样才能更优雅?
答案 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());