字符串变量插值 Java

2022-08-31 05:28:24

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

答案 1

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

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

有关详细信息,请参阅格式化程序


答案 2

请注意,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(原始字符串文本)被撤回并被多个JEP取代,最终导致JEP 378:在Java 15中交付的文本块。

文本块是一种多行字符串文本,它避免了对大多数转义序列的需求,以可预测的方式自动设置字符串的格式,并在需要时使开发人员能够控制格式。

但是,仍然没有字符串插值

非目标: ...文本块不直接支持字符串插值。在将来的 JEP 中可以考虑插值。同时,新的实例方法 String::formatd 有助于在可能需要插值的情况下使用。