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 + ";";
做:
urlString += Interpolator("u1=%s;u2=%s;u3=%s;u4=%s;", u1, u2, u3, u4);
或:
urlStringBuilder.append(Interpolator("u1=%s;u2=%s;u3=%s;u4=%s;", u1, u2, u3, u4));
编辑2024 年 3 月 过去十年,很多事情都发生了变化。 Java目前有 预览功能中的JEP 430:字符串模板(Java 21 和 Java 22)。字符串模板并不等同于字符串插值,但它们支持字符串插值。字符串模板比 C#、Perl 或 Python 中的传统字符串插值功能强大得多。它们允许创建自定义模板处理器,并且根据文档,它们更安全。
import static java.util.FormatProcessor.FMT;
void main() {
int age = 34;
String name = "William";
String msg = STR."\{name} is \{age} years old";
System.out.println(msg);
String msg2 = FMT."%s\{name} is %d\{age} years old";
System.out.println(msg2);
}
Java 现在支持两个内置字符串处理器:
STR
和 FMT
。
后者必须显式导入。
来自 JEP:
STR是Java平台中定义的模板处理器。它通过将模板中的每个嵌入表达式替换为该表达式的(字符串化)值来执行字符串插值。
FMT是Java平台中定义的另一个模板处理器。 FMT 与 STR 类似,它执行插值,但它也解释出现在嵌入表达式左侧的格式说明符。
本质上,Java 现在支持预览中的字符串插值,这是一个更强大的概念,称为字符串模板。
以下信息现已过时,反映了 Java 21 之前的情况:
注意Java中没有变量插值。 变量插值是用字符串内的值进行变量替换。 Ruby 中的示例:
#!/usr/bin/ruby
age = 34
name = "William"
puts "#{name} is #{age} years old"
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::formatted
补充一点,还有 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.
String.format()
来救援!!
您可以使用 Kotlin,它是 JVM 的 Java 的超级(割让者),它有一种很好的方式来插入字符串,就像 ES5、Ruby 和 Python 的字符串一样。
class Client(val firstName: String, val lastName: String) {
val fullName = "$firstName $lastName"
}