Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有一种方法可以使用SLF4J样式的格式化函数构建Java字符串?_Java_String_String Formatting - Fatal编程技术网

有没有一种方法可以使用SLF4J样式的格式化函数构建Java字符串?

有没有一种方法可以使用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

我听说使用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

如果您必须不断向字符串中添加内容,但无法将它们全部放在一个语句中,则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();
}