Java中的String.format()和str.formatted()有何不同?

14

我知道方法String.format()几乎与方法System.out.printf()相同,只是它返回一个字符串。但我很难找到关于定义如下的“formatted”方法的介绍:

public String formatted(Object... args) {
        return new Formatter().format(this, args).toString();
}

我知道下面两个代码的功能是相同的。

String str1 = String.format("%s", "abab");
System.out.println(str1);

String str2;
str2 = "%s".formatted("abab");
System.out.println(str2);

所以我想知道它们之间的区别。谢谢!


3
format()是String类的一个静态方法,而formatted()则是String类的一个实例方法。 - President James K. Polk
3
formatted 是后来添加的,作为 文本块 的可用性增强。在功能上没有任何区别。 - Tim Moore
1
"formatted是在JDK 15之后才被添加的。" - Jacob van Lingen
2个回答

16

确保使用良好的集成开发环境(IDE),这样您就可以轻松访问浏览JDK源代码。在Eclipse中,使用F3打开任何声明。IntelliJ IDEA具有类似的功能。

如果您查看两种方法的源代码,您会发现这些调用是相同的,除了在比较实例方法和静态方法时变量thisformat交换:

public String formatted(Object... args) {
    return new Formatter().format(this, args).toString();
}
public static String format(String format, Object... args) {
    return new Formatter().format(format, args).toString();
}

因此,正如您所观察到的:String.format(str, args)str.formatted(args)相同。

2

文本块JDK 15中已经最终确定并永久添加,还添加了一些支持文本块的附加方法。其中之一是:

String::formatted(Object... args)

我知道下面两个代码的功能是相同的。
正如您在问题中提到的,这两种方法都可以完成相同的工作并返回相同的结果。引入这样一种方法的目的是:

简化文本块中的值替换


根据JEP(JDK增强提案)378:

文本块不直接支持字符串插值。将来可能会考虑插值。同时,新的实例方法String::formatted有助于需要插值的情况。

例如,您可以考虑以下代码段:
String code = String.format("""
      public void print(%s o) {
          System.out.println(Objects.toString(o));
      }
      """, type);

我们可以使用格式化方法来更改它:

String source = """
        public void print(%s object) {
            System.out.println(Objects.toString(object));
        }
        """.formatted(type);

这样更加干净。



当使用这些方法时,还要考虑它们之间的一些小差异:

public static String format(String format, Object... args)
  • 使用格式字符串参数返回格式化的字符串。
  • 这是String类的一个静态方法。
  • 它在Java SE 5[自2004年起]中引入。

public String formatted(Object... args)
  • 使用此字符串作为格式字符串和提供的参数来格式化。
  • 它是String类的一个实例方法。
  • 它是在Java SE 15(JDK 15)[自2020年起]引入的。
  • 此方法等效于String.format(this,args)

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