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

BD *_*ill 15 java string string-formatting

我听说使用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);
Run Code Online (Sandbox Code Playgroud)

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

Ami*_*iri 23

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

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

public static String format(String format, Object... params) {
    return MessageFormatter.arrayFormat(format, params).getMessage();
}
Run Code Online (Sandbox Code Playgroud)

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


Mic*_*ers 8

对于连接字符串一次,老可靠"str" + param + "other str"是完全没有问题(它实际上是由编译器转换成StringBuilder).

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

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

这将比等效的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();
Run Code Online (Sandbox Code Playgroud)

但这两个在功能上是等价的:

String str = var1 + " " + var2;
String str2 = new StringBuilder().append(var1).append(" ").append(var2).toString();
Run Code Online (Sandbox Code Playgroud)

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

退房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));
Run Code Online (Sandbox Code Playgroud)

输出:

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

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

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

  • @Andreas:我不知道那个"util"是如何进入那里的.我责怪java.gremlins包. (2认同)