空时获取空字符串


73

我想获取字段的字符串值(它们可以是长字符串或任何对象的类型),

如果一个字段为空,那么它应该返回空字符串,我用番石榴做过;

nullToEmpty(String.valueOf(gearBox))
nullToEmpty(String.valueOf(id))
...

但是如果gearbox为null,则返回null!非空字符串,因为valueOf methdod返回字符串“ null”,这会导致错误。

有任何想法吗?

EDIt:有100多个字段,我正在寻找易于实现的字段

Answers:


175

可以使用Objects.toString()(Java 7中的标准):

Objects.toString(gearBox, "")

Objects.toString(id, "")

从链接的文档中:

public static String toString(Object o, String nullDefault)

toString如果第一个参数不为null,则返回调用第一个参数的结果,否则返回第二个参数。

参数:
o -一个对象
nullDefault-如果第一个参数为null

返回:如果不是,则
调用toString第一个参数,否则调用null第二个参数。

也可以看看:
toString(Object)


@Spring您应该考虑升级,尤其是随着Java 8即将推出。无论如何,我将保留此答案,以免对将来的访问者有所帮助。
arshajii 2014年

2
Downvoter:请发表评论。我想知道我的答案出了什么问题,仅凭投票就不会告诉我。
arshajii 2014年

尼斯 我建议Objects.toString(id, "").trim()
Wender

为什么需要> API 19 ...这是一个简单的检查。我想我必须写我自己
M.kazem Akhgary

1
风险是您丢失字符串的类型。当前是字符串,但是如果将来将其更改为其他类型,他的编译器将不会保护您
ozma

49

对于Java 8,您可以使用Optional方法:

Optional.ofNullable(gearBox).orElse("");
Optional.ofNullable(id).orElse("");

1
如果id不是字符串,则似乎第二行代码不起作用
jack jin

1
这将执行两个方法调用并分配一个新对象,然后立即将其丢弃。这不是简单方法的改进gearBox == null ? "" : gearBox。像这样的单个方法调用StringUtils.defaultString更加JIT友好。
Vroo '20年

@Vroo,如果您不希望丢弃,则orElseGet可以代替使用
Federico Piazza

1
@FedericoPiazza不能改善。首先,请orElseGet一个代表,所以现在我有三个方法调用。第二,Optional仍然创建对象然后将其丢弃。
Vroo

26

如果您不介意使用Apache Commons,则可以使用Apache Commons StringUtils.defaultString(String str)

返回传入的String,或者如果String为null,则返回一个空的String(“”)。

如果您还想摆脱"null",可以执行以下操作:

StringUtils.defaultString(str).replaceAll("^null$", "")

或忽略大小写:

StringUtils.defaultString(str).replaceAll("^(?i)null$", "")

如果字符串是字符串“ null”怎么办?多数民众赞成在我的问题
春天

@Spring:也进行了更新以解决这种情况。
开普勒2014年

StringUtils.defaultString已经检查为空。因此,replaceAll仅当字符串是文字时才更改字符串"null",这不是要求的。来源:public static String defaultString(String str) { return str == null ? "" : str; }
Vroo

我认为第一条评论涉及文字字符串"null"
Keppil '20

9

如果有其他选择,番石榴提供Strings.nullToEmpty(String)

源代码

String str = null;
str = Strings.nullToEmpty(str);
System.out.println("String length : " + str.length());

结果

0


6

由于您正在使用番石榴:

Objects.firstNonNull(gearBox, "").toString();

1
是您的个人资料照片吗?那不是乔恩吗?
2014年

来自番石榴18的咖啡,您需要使用MoreObjects.firstNonNull
Juan Rada

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.