字符串变量插值Java [重复]

问题描述 投票:0回答:5

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));
java string-interpolation
5个回答
435
投票

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

String.format
:

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

详情请参阅

Formatter


140
投票

编辑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
在可能需要插值的情况下提供帮助。


47
投票

补充一点,还有 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.

21
投票

String.format()
来救援!!


-2
投票

您可以使用 Kotlin,它是 JVM 的 Java 的超级(割让者),它有一种很好的方式来插入字符串,就像 ES5、Ruby 和 Python 的字符串一样。

class Client(val firstName: String, val lastName: String) {
    val fullName = "$firstName $lastName"
}
© www.soinside.com 2019 - 2024. All rights reserved.