Java 8流字符串Null或空筛选器

Java 8流字符串Null或空筛选器,java,java-8,guava,java-stream,Java,Java 8,Guava,Java Stream,我在流中有谷歌番石榴: 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)在f

我在流中有谷歌番石榴:

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)
在filter函数中

我不想在项目中再使用番石榴,所以我只想用以下方法来取代它:

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

我怎样才能做得更优雅呢

您可以使用自己的谓词创建自己的
字符串
类:

public class Strings {
  public static boolean isNotNullOrEmpty (String str) {
    return str != null && !str.isEmpty();
  }
}
final Predicate<Map.Entry<?, String>> valueNotNullOrEmpty
    = e -> e.getValue() != null && !e.getValue().isEmpty();
然后在代码中:

.filter(Strings::isNotNullOrEmpty)

但正如@fge提到的,你不能在
地图上使用它。Entry

你可以编写你自己的谓词:

public class Strings {
  public static boolean isNotNullOrEmpty (String str) {
    return str != null && !str.isEmpty();
  }
}
final Predicate<Map.Entry<?, String>> valueNotNullOrEmpty
    = e -> e.getValue() != null && !e.getValue().isEmpty();

final谓词如果您更喜欢使用commons-lang3,StringUtils

  • isEmpty()
  • isNotEmpty()
  • isBlank()
  • isNotBlank()
这些方法可在筛选器中用作方法引用:

this.stringList.stream().filter(StringUtils::isNotBlank);
或作为lambdas:

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()
或不需要文档化或确定性行为的东西

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

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中有一个新方法

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

list.stream()
.filter(对象::非空)
.filter(谓词.not(字符串::isEmpty))

使用StringUtils(apache commons lang)或
可选.ofNullable(string).orElse(“”.length()==0
我想使用纯Java-在这里可以吗?
可选.ofNullable(string).orElse(“”.length()==0
是纯的java@griFlo
String
.isEmpty()
那么为什么还要麻烦做length()部分呢?还有,我不明白代码是如何工作的;您不能在
映射上使用
字符串.isNullOrEmpty()
。Entry
那么,您在问题中显示了真实的代码怎么样?正如我所说的,当前的代码摘录不会编译,图像不会显示给我;你可以随心所欲,这是事实:你在问题中发布的代码不会编译。@ServerSideCat:不,我们不能。我们是程序员。我们的工作是基于事实的,比如一个
映射。条目
不是一个
字符串
。我们不能因为你说“我看到它在工作”,就接受那些声称可以工作的代码。因为这不是看它的问题,而是理解发生了什么。如果你理解这一点,你会尽一切努力去发现,哪里是不匹配的。当出现明显错误的代码时,它会让您感到紧张,尤其是当它是生产代码时。您正在对
entrySet().stream()调用
filter(…)
,因此它需要一个
谓词。指向显然,复制问题的代码无论如何都无法编译,因为甚至没有
map
的定义。如果您将您发布在该图像宿主上的代码与您在问题中发布的代码进行比较,您会注意到此处缺少的小
getValue()
调用,这将产生巨大的差异。您只是未能进行正确的复制和粘贴。@ServerSideCat,您的屏幕截图是
isNullOrEmpty(entity.getValue())
,而您的问题是
isNullOrEmpty(entity)
。我认为isBlank()isNotBlank()方法非常有用,但其他人都知道,它们与isNullOrEmpty()不同因为它们还检查其他空白字符,如制表符、回车符等。这是由Java中的isWhiteSpace()函数定义的: