字符串变量插值Java

字符串变量插值Java,java,string-interpolation,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,类似以下内容:

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 + ";";
做:

或:


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


有关详细信息,请参阅。

向救援人员求助

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

#/usr/bin/ruby
年龄=34
name=“威廉”
放入“{name}是{age}岁”
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()方法构建一个新字符串。结果是一样的,但方法不同

编辑自2019年起,(原始字符串文本)被撤销,并被多个JEP取代,最终以Java 15交付

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

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

非目标:… 文本块不直接支持字符串插值。插值可在未来的JEP中考虑。同时,新的实例方法有助于处理可能需要插值的情况


只需补充一点,拥有数字参数索引也有好处

附加文档中的第一个示例

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.

您可以使用Kotlin,Java for JVM的超级(cede),它有一种很好的插入字符串的方法,比如ES5、Ruby和Python

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

警告:MessageFormat比字符串串联或
string.format()
慢几个数量级。如果您知道如何使用
string.format()
,即使用格式标识符的
n$
部分,则这不应该是一个很大的优势。正如@Adowrath指出的,您可以使用以下内容引用索引:
String.format(“在%2$tD上的%2$tT处,行星%1$d.上有%3$s”,行星,新日期(),事件)@ecoe,但肯定更难记住,至少对我来说,我想知道为什么Java语言不支持/引入插值字符串。这似乎是一个非常有用的功能。Java字符串是不可变的,无法更改,因此没有“将XXX插入字符串YYY”。一个简化的语法,如带有String.format()语义的Ruby#{}(即创建一个新字符串),将尊重字符串的不可变性,但是运行一堆其他核心Java设计约束。@jackr Python的字符串也是不可变的。然而,“字符串插值”更像是一种构造字符串的方法,而不是编辑现有字符串的方法。java中没有引入它很可能是因为其他优先级。它存在于C#和许多其他更像java的语言中。@jackr C#处理字符串的方式与java非常相似,并且它已经插入了strings@jackr,如果我们有这个特性,它将大大提高代码的可读性。关于不变性的问题,我坚信这可以在编译时完成;虽然kotlin很好(我经常使用它!),但我不确定这与指定java的问题有多相关。是的,它仍然是。Kotlin Java具有互操作性。这意味着您可以在Java代码中调用Kotlin代码,反之亦然。完全可互操作并不意味着您一定要在Java项目中使用它。是的,但这是Java用户的特权。:)在Java中使用字符串插值。尽量避免
String.format()
,原因如下:那篇文章没有说“避免
String.format
”。我不相信它比它列出的任何其他方法都有更多的缺点。>在Java中使用for字符串插值。很抱歉,Java不够聪明,无法进行字符串插值。如果您关心性能,应该避免使用
string.format
@MiaeKim:完全可以在不对每一行代码进行微优化的情况下关注性能。我非常关心野田佳彦的性能,但我非常乐意在抛出异常时进行字符串格式化。就像你提到的野田佳彦,这完全取决于用例。如果在创建大量日志的情况下,String.format也会受到影响。这个评论仅供参考。@MiaeKim:那么我认为应该更仔细地审视一下。“对于性能至关重要的代码片段”比“如果您关心性能”更有帮助。作为一名开发人员,谁会说他们不关心性能?这是一个判断为了性能而牺牲可读性的问题。
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.
class Client(val firstName: String, val lastName: String) {
    val fullName = "$firstName $lastName"
}