Apache的StringUtils.isBlank(str)和Guava的Strings.isNullOrEmpty(str):你是否应该经常检查空格?

22

使用有什么优势吗?

StringUtils.isBlank(str) 

来自Apache commons-lang库。

对比:

Strings.isNullOrEmpty(String string)

来自Google Guava?

我希望在Java项目中替换数百个以下用法:

if(str == null || str.isEmpty())

Guava的isNullOrEmpty方法似乎是我项目中上述用法的直接替代品。根据我对S.O.问题的阅读,更多人似乎使用Apache的isBlank方法。唯一的区别似乎是StringUtils.isBlank(str)除了检查字符串是否为空或null外,还检查空格通常检查字符串中是否有空格是个好主意吗?这样做会产生与Guava简单检查不同的结果吗?

1
当然可以产生不同的结果。两种方法并不执行相同的操作。 - Lynch
1
嘿,别忘了把Spring的StringUtils也加入进去:http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/util/StringUtils.html - Adam Gent
参见:https://github.com/google/guava/issues/352 - Arto Bendiken
5个回答

17
如果你想使用Guava复制isBlank的行为,我会使用以下方法: Strings.nullToEmpty(str).trim().isEmpty()

8

当你需要接受人类的输入时,在特定应用程序中可以考虑从他们键入的任何文本中宽容地去除前导和尾随的空格。

也就是说,仅使用 isBlank 是不够全面的。在进一步处理字符串之前,您还需要对其进行 trim。因此,我建议在使用 isNullOrEmpty 进行检查之前使用 s = trim(s);


2
这就是为什么我写了s = trim(s)而不是s = s.trim()trim将是空安全的变体。 - Roland Illig
但这样做有点背离初衷,对吧?trim(s)必须在调用s.trim()之前检查null,此时Strings.isNullOrEmpty(s')只有一半有用。StringUtils.isBlank(s)似乎可以在这里完成所有需要的操作。 - Jamie Bisotti
3
“isBlank”的不足之处在于它不能修正输入,因此你最终会对前端中去除空格的字符串进行验证,但继续处理时会使用包含空格的字符串,这听起来有些奇怪。 - Roland Illig
1
很遗憾,字符串(Strings)没有提供空值安全修剪的方法(例如StringUtils.trimToEmpty)。如果有这些方法,它们可能会表明他们实际上考虑了使用情况。 - Hakanai

3

StringUtils.isBlank(str)Strings.isNullOrEmpty(String string)非常不同。

第一个代码示例仅检查字符串是否为空,它也将包括空格,并返回true

StringUtils.isBlank(null)      = true 
StringUtils.isBlank("")         = true 
StringUtils.isBlank(" ")        = true 
StringUtils.isBlank("bob")      = false
StringUtils.isBlank("  bob  ")  = false

Strings.isNullOrEmpty(String string)的作用是:如果给定的字符串为null或者为空字符串,则返回true


0

isBlank被高估了。读取用户文本的UI代码可以一次性修剪空格,然后您就不必再担心它了。


5
“isBlank”为何被过高评价? - benson
2
如果您正在编写非网络应用程序的代码,例如从平面文件导入数据的工具(某人使用有错误的代码生成文件,您会得到像“ ”<--其中包含制表符和空格的数据字段)。我只是想指出,并非所有代码都经过预先净化,而isBlank非常适用于这些用例。 - benson
3
但这真的是必要的吗?为什么您希望将空格从“”中删除以检测它是否为空,但保留“ dog ”中的空格?假设您能想出一个原因,那么这种情况有多频繁发生呢?我认为 isBlank 是历史上最被滥用的库方法。 :-) - Kevin Bourrillion
2
@KevinBourrillion 我想你会经常需要它,因为你正在处理依赖于那种检查的旧代码,并且你正在尝试使代码更易于阅读。 - Adam Adamaszek
14
每次我查询Guava中不存在的方法时,@KevinBourrillion似乎总有一个回答,比如“没有人需要这个”或“它不应该这样”。人们并非总是在完美的世界中工作,可能需要保护他们的数据免受垃圾数据的影响。你知道的,当你在处理由数十位初学者使用的业务服务时?或者正在处理一个批处理,该批处理会从50年前的IBM主机程序员编写的扁平文件中读取,并且在你出生之前就将其区域用空格填充, 而且对Java毫不在意? 这就是现实,伙计,“isBlank”很有用。 - Michael Técourt
显示剩余4条评论

-5

Guava 更多或少是针对成为 Apache Commons 的“下一代”替代品。在使用 isBlank() vs isNullOrEmpty() 之间,实际上并没有太大的实际区别,除了始终使用其中一个。


7
那么关于这个问题的核心——如何检查空白区域呢? - Fritz Duchardt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接