Make String.format("%s",arg)显示空值参数与"null"不同

VH-*_*NZZ 33 java string null string.format string-formatting

考虑toString()bean 的自定义实现:

@Override
public String toString() {
    String.format("this is %s", this.someField);
}
Run Code Online (Sandbox Code Playgroud)

this is null如果someField为null,则产生if .

有没有办法将null空值参数的默认字符串表示形式覆盖到另一个文本,即? 没有replaceAll(...)toString方法中显式调用?

注意:bean继承自可以实现的超类Formattable(http://docs.oracle.com/javase/7/docs/api/java/util/Formattable.html),但我似乎并不理解如何制作这项工作.

编辑:为了举例,该片段被过度简化,但我不是在寻找三元运算符解决方案,someField==null ? "?" : someField因为:

  • 可能(可能)涉及很多领域,toString()因此检查所有字段过于繁琐且不流畅.
  • 我无法控制的其他人(如果有的话)正在编写他们自己的子类.
  • 如果一个方法被调用并返回null,则暗示调用该方法两次或声明一个局部变量.

相反,可以使用Formattable界面或有一些自定义Formatter(这是final顺便说一句)完成任何事情?

Dmi*_*kov 34

使用java 8,您现在可以使用Optional类:

import static java.util.Optional.ofNullable;
...
String myString = null;
System.out.printf("myString: %s",
    ofNullable(myString).orElse("Not found")
);
Run Code Online (Sandbox Code Playgroud)


小智 21

在我看来,最好的解决方案是使用Guava的Objects方法,firstNonNull.如果someField为null,则以下方法将确保您将打印空字符串.

String.format("this is %s", MoreObjects.firstNonNull(this.someField, ""));
Run Code Online (Sandbox Code Playgroud)

番石榴文件.

  • `String.format("this is%s",StringUtils.defaultIfBlank(this.someField,""));`如果Apache StringUtils碰巧在你的类路径上,那么`就可以了. (10认同)

Kli*_*cou 21

对于不需要外部库的Java 7解决方案:

String.format("this is %s", Objects.toString(this.someField, "?"));
Run Code Online (Sandbox Code Playgroud)


Ruc*_*era 5

如果您不想使用replaceAll(),可以为其分配默认文本(String)someField.

但如果有一段时间,这可能null再次分配.因此,您可以对该案例使用验证

 this.someField == null ? "defaultText" : this.someField
Run Code Online (Sandbox Code Playgroud)


JM *_*ord 5

关于这个问题有点晚了,但这可能是一个非常干净的解决方案:首先,创建自己的格式方法......

private static String NULL_STRING = "?";

private static String formatNull(String str, Object... args){
    for(int i = 0; i < args.length; i++){
        if(args[i] == null){
            args[i] = NULL_STRING;
        }
    }

    return String.format(str, args);
}
Run Code Online (Sandbox Code Playgroud)

然后,按原样使用它......

@Test
public void TestNullFormat(){
    Object ob1 = null;
    Object ob2 = "a test";

    String str = formatNull("this is %s", ob1);
    assertEquals("this is ?", str);

    str = formatNull("this is %s", ob2);
    assertEquals("this is a test", str);
}
Run Code Online (Sandbox Code Playgroud)

这消除了对多个难以阅读的三元运算符的需求.