有没有一种方法可以使用SLF4J样式的格式化函数构建Java字符串?
我听说使用StringBuilder比使用字符串连接更快,但我厌倦了一直与StringBuilder对象搏斗。我最近接触了SLF4J日志库,与String.format相比,我喜欢其格式的“只做正确的事情”简单性。有没有一个图书馆可以让我写下这样的东西:有没有一种方法可以使用SLF4J样式的格式化函数构建Java字符串?,java,string,string-formatting,Java,String,String Formatting,我听说使用StringBuilder比使用字符串连接更快,但我厌倦了一直与StringBuilder对象搏斗。我最近接触了SLF4J日志库,与String.format相比,我喜欢其格式的“只做正确的事情”简单性。有没有一个图书馆可以让我写下这样的东西: int myInteger = 42; MyObject myObject = new MyObject(); // Overrides toString() String result = CoolFormatingLibrary.form
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
)
如果您必须不断向字符串中添加内容,但无法将它们全部放在一个语句中,则StringBuilder非常有用。例如,以For循环为例:
String str = "";
for (int i = 0; i < 1000000; i++) {
str += i + " "; // ignoring the last-iteration problem
}
话虽如此,我的实际答案是: 签出。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));
输出:
磁盘“MyDisk”包含1273个文件。
还有一种静态方法,它不需要创建MessageFormat
对象
所有这些库都可以归结为最基本级别的字符串连接,因此它们之间的性能差异不会很大。虽然公认的答案是好的,但如果(像我一样)有人对Slf4J风格的语义感兴趣,那么正确的解决方案是使用Slf4J的 下面是一个示例用法片段:
public static String format(String format, Object... params) {
return MessageFormatter.arrayFormat(format, params).getMessage();
}
(请注意,此示例丢弃了类型为
Throwable
)的最后一个参数。加上值得注意的是,String.format()是用regexps完成的sprintf的一个糟糕实现,因此如果您评测代码,您将看到一个您不期望的模式和int[]。
MessageFormat和slf MessageFormmater通常更快,分配的垃圾更少为什么String.format不适合您?两者的用法非常接近。我不知道String.format的性能,但您可能希望通过任何外部库使用它,以避免将依赖项导入应用程序。我我将简要介绍一下String.format的实现……这也是我在检查了OpenJDK对java.util.Formatter的实现之后得出的结论。就在这一刻,我发现了MessageForamt类并记住了这个线程……很高兴看到您已经知道了它。一个提示:实际上它是java.text。MessageFormat@Andreas例如我有我不知道“util”是怎么进来的。我责备java.gremlins包。我不确定总是责备java.gremlins是否正确。从来没有人责备java.starwars.sith.lords甚至java.jucknorris…;-)注意
MessageFormat
使用StringBuffer
而不是StringBuilder
。这正是我想要的
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));
public static String format(String format, Object... params) {
return MessageFormatter.arrayFormat(format, params).getMessage();
}