有没有办法使用SLF4J样式的格式化函数构建Java String?

我听说使用StringBuilder比使用字符串连接更快,但我已经厌倦了一直在与StringBuilder对象进行摔跤。 我最近接触过SLF4J日志库,与String.format相比,我喜欢其格式化的“正确做事”。 那里有一个图书馆可以让我写下这样的东西:

int myInteger = 42; MyObject myObject = new MyObject(); // Overrides toString() String result = CoolFormatingLibrary.format("Simple way to format {} and {}", myInteger, myObject); 

另外,是否有任何原因(包括性能但不包括对日期和重要数字格式的细粒度控制)为什么我可能想要在这样的库中使用String.format(如果它存在的话)?

对于连接字符串一次 ,旧的可靠"str" + param + "other str"完全正常(它实际上由编译器转换为StringBuilder )。

如果你必须继续向字符串添加内容,StringBuilders主要是有用的,但你不能将它们全部放入一个语句中。 例如,采用for循环:

 String str = ""; for (int i = 0; i < 1000000; i++) { str += i + " "; // ignoring the last-iteration problem } 

这将比等效的StringBuilder版本运行得慢得多:

 StringBuilder sb = new StringBuilder(); // for extra speed, define the size for (int i = 0; i < 1000000; i++) { sb.append(i).append(" "); } String str = sb.toString(); 

但这两个在function上是等价的:

 String str = var1 + " " + var2; String str2 = new StringBuilder().append(var1).append(" ").append(var2).toString(); 

说了这么多,我的实际答案是:

查看java.text.MessageFormat 。 来自Javadocs的示例代码:

 int fileCount = 1273; String diskName = "MyDisk"; Object[] testArgs = {new Long(fileCount), diskName}; MessageFormat form = new MessageFormat("The disk \"{1}\" contains {0} file(s)."); System.out.println(form.format(testArgs)); 

输出:

The disk "MyDisk" contains 1,273 file(s).

还有一种静态format方法,它不需要创建MessageFormat对象。

所有这些库都将归结为最基本级别的字符串连接,因此彼此之间的性能差异不会很大。

虽然接受的答案是好的,如果(像我一样)一个人对Slf4J风格的语义感兴趣,那么正确的解决方案是使用Slf4J的MessageFormatter

以下是一个示例用法代码段:

 public static String format(String format, Object... params) { return MessageFormatter.arrayFormat(format, params).getMessage(); } 

(注意,此示例丢弃了Throwable类型的最后一个参数)

您已经可以使用内置的Java String类完成此操作 。