字符串变量插值Java

时间:2011-06-17 17:59:54

标签: java string-interpolation

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("?");

SURELY我错过了一些东西。 GOT是一种更好的方式。类似的东西:

而不是:

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));

5 个答案:

答案 0 :(得分:242)

如果您使用的是Java 5或更高版本,则可以使用String.format

urlString += String.format("u1=%s;u2=%s;u3=%s;u4=%s;", u1, u2, u3, u4);

有关详细信息,请参阅Formatter

答案 1 :(得分:68)

请注意,Java中没有变量插值。 变量插值是变量替换,其值在字符串内。 Ruby中的一个例子:

#!/usr/bin/ruby

age = 34
name = "William"

puts "#{name} is #{age} years old" 

Ruby解释器会自动将变量替换为字符串中的值。 事实上,我们要进行插值是由sigil字符暗示的。在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:Raw String Literals提到将来可能会在该语言中添加字符串插值。

  

原始字符串文字不直接支持字符串插值。   可以在未来的JEP中考虑插值。

JEP 326: Raw String Literals

答案 2 :(得分:28)

只是要补充一点,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.

答案 3 :(得分:17)

String.format()救援!!

答案 4 :(得分:7)

你可以使用Kotlin,JVM的Super(cede of)Java,它有一种插入字符串的好方法,如ES5,Ruby和Python。

class Client(val firstName: String, val lastName: String) {
    val fullName = "$firstName $lastName"
}