Java中的字符串构建让我感到困惑。我讨厌做这样的事情:
url += "u1=" + u1 + ";u2=" + u2 + ";u3=" + u3 + ";u4=" + u4 + ";";
url += "x=" + u1 + ";y=" + u2 + ";z=" + u3 + ";da1=" + u4 + ";";
url += "qty=1;cost=" + orderTotal + ";ord=" + orderId + "?";
或者,使用StringBuilder,像这样:
url.append("u1=");
url.append(u1);
url.append(";u2=");
url.append(u2);
url.append(";u3=");
url.append(u3);
url.append(";u4=");
url.append(u4);
url.append(";");
url.append("x=");
url.append(u1);
url.append(";y=");
url.append(u2);
url.append(";z=");
url.append(u3);
url.append(";da1=");
url.append(u4);
url.append(";");
url.append("qty=1;");
url.append("cost=");
url.append(orderTotal);
url.append(";ord=");
url.append(orderId);
url.append("?");
我肯定错过了什么。肯定有更好的办法。喜欢的东西:
而不是:
urlString += "u1=" + u1 + ";u2=" + u2 + ";u3=" + u3 + ";u4=" + u4 + ";";
do:
urlString += Interpolator("u1=%s;u2=%s;u3=%s;u4=%s;", u1, u2, u3, u4);
or:
urlStringBuilder.append(Interpolator("u1=%s;u2=%s;u3=%s;u4=%s;", u1, u2, u3, u4));
注意,Java中没有变量插值。
变量插值是将变量值替换到字符串中。
Ruby中的一个例子:
#!/usr/bin/ruby
age = 34
name = "William"
puts "#{name} is #{age} years old"
Ruby解释器自动将变量替换为字符串中的值。
事实上,我们要做插值是由符号字符暗示的。在Ruby中,
它是#{}。在Perl中,它可以是$、%或@。Java只打印这样的字符,
它不会扩大它们。
Java中不支持变量插值。相反,我们
有字符串格式。
package com.zetcode;
public class StringFormatting
{
public static void main(String[] args)
{
int age = 34;
String name = "William";
String output = String.format("%s is %d years old.", name, age);
System.out.println(output);
}
}
在Java中,我们使用string .format()方法构建一个新字符串。结果是一样的,但方法不同。
参见http://en.wikipedia.org/wiki/Variable_interpolation
截至2019年,JEP 326(原始字符串字面量)被撤回,并被多个JEP所取代,最终导致JEP 378:在Java 15中交付的文本块。
文本块是一个多行字符串文字,它避免了大多数转义序列的需要,以可预测的方式自动格式化字符串,并在需要时让开发人员控制格式。
然而,仍然没有字符串插值:
非目标:…
文本块不直接支持字符串插值。在未来的JEP中可能会考虑插值。与此同时,新的实例方法String::格式化有助于可能需要插值的情况。
再补充一点,java.text.MessageFormat的好处是有数值参数索引。
附加文档中的第一个示例
int planet = 7;
String event = "a disturbance in the Force";
String result = MessageFormat.format(
"At {1,time} on {1,date}, there was {2} on planet {0,number,integer}.",
planet, new Date(), event);
结果:
At 12:30 PM on Jul 3, 2053, there was a disturbance in the Force on planet 7.
注意,Java中没有变量插值。
变量插值是将变量值替换到字符串中。
Ruby中的一个例子:
#!/usr/bin/ruby
age = 34
name = "William"
puts "#{name} is #{age} years old"
Ruby解释器自动将变量替换为字符串中的值。
事实上,我们要做插值是由符号字符暗示的。在Ruby中,
它是#{}。在Perl中,它可以是$、%或@。Java只打印这样的字符,
它不会扩大它们。
Java中不支持变量插值。相反,我们
有字符串格式。
package com.zetcode;
public class StringFormatting
{
public static void main(String[] args)
{
int age = 34;
String name = "William";
String output = String.format("%s is %d years old.", name, age);
System.out.println(output);
}
}
在Java中,我们使用string .format()方法构建一个新字符串。结果是一样的,但方法不同。
参见http://en.wikipedia.org/wiki/Variable_interpolation
截至2019年,JEP 326(原始字符串字面量)被撤回,并被多个JEP所取代,最终导致JEP 378:在Java 15中交付的文本块。
文本块是一个多行字符串文字,它避免了大多数转义序列的需要,以可预测的方式自动格式化字符串,并在需要时让开发人员控制格式。
然而,仍然没有字符串插值:
非目标:…
文本块不直接支持字符串插值。在未来的JEP中可能会考虑插值。与此同时,新的实例方法String::格式化有助于可能需要插值的情况。