Java 8 流字符串 Null 或空过滤器
Java 8 Stream String Null Or Empty 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;
怎样才能更优雅呢?
您可以使用自己的谓词创建自己的 Strings
class:
public class Strings {
public static boolean isNotNullOrEmpty (String str) {
return str != null && !str.isEmpty();
}
}
然后在你的代码中:
.filter(Strings::isNotNullOrEmpty)
但是正如@fge 提到的那样,您不能在 Map.Entry<?,?>
...
上使用它
您可以编写自己的谓词:
final Predicate<Map.Entry<?, String>> valueNotNullOrEmpty
= e -> e.getValue() != null && !e.getValue().isEmpty();
然后只需使用 valueNotNullOrEmpty
作为您的过滤器参数。
如果您更喜欢使用 commons-lang3,StringUtils 有
isEmpty()
isNotEmpty()
isBlank()
isNotBlank()
这些方法可以在过滤器中用作方法参考:
this.stringList.stream().filter(StringUtils::isNotBlank);
或作为 lambda:
this.stringList.stream().filter(s -> StringUtils.isNotBlank(s));
您可以将过滤器分解为两个步骤:
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()
或不需要记录或确定性行为的东西。
此外,我知道您想放弃 Guava,但这里有一个可能会让您重新考虑的解决方案:
Joiner.on(',').withKeyValueSeparator("=")
.join(Maps.filterValues(map, Predicates.not(Strings::isNullOrEmpty)));
对我有用:list.stream().filter(el-> el != null && !el.toString().trim().isEmpty()).collect(Collectors.toList());
在java11中有一个新方法Predicate::not。
所以你可以过滤掉空字符串:
list.stream()
.filter(Objects::nonNull)
.filter(Predicate.not(String::isEmpty))
我在 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;
怎样才能更优雅呢?
您可以使用自己的谓词创建自己的 Strings
class:
public class Strings {
public static boolean isNotNullOrEmpty (String str) {
return str != null && !str.isEmpty();
}
}
然后在你的代码中:
.filter(Strings::isNotNullOrEmpty)
但是正如@fge 提到的那样,您不能在 Map.Entry<?,?>
...
您可以编写自己的谓词:
final Predicate<Map.Entry<?, String>> valueNotNullOrEmpty
= e -> e.getValue() != null && !e.getValue().isEmpty();
然后只需使用 valueNotNullOrEmpty
作为您的过滤器参数。
如果您更喜欢使用 commons-lang3,StringUtils 有
isEmpty()
isNotEmpty()
isBlank()
isNotBlank()
这些方法可以在过滤器中用作方法参考:
this.stringList.stream().filter(StringUtils::isNotBlank);
或作为 lambda:
this.stringList.stream().filter(s -> StringUtils.isNotBlank(s));
您可以将过滤器分解为两个步骤:
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()
或不需要记录或确定性行为的东西。
此外,我知道您想放弃 Guava,但这里有一个可能会让您重新考虑的解决方案:
Joiner.on(',').withKeyValueSeparator("=")
.join(Maps.filterValues(map, Predicates.not(Strings::isNullOrEmpty)));
对我有用:list.stream().filter(el-> el != null && !el.toString().trim().isEmpty()).collect(Collectors.toList());
在java11中有一个新方法Predicate::not。
所以你可以过滤掉空字符串:
list.stream()
.filter(Objects::nonNull)
.filter(Predicate.not(String::isEmpty))