字符串变量插值Java

cmc*_*loh 154 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 + "?";
Run Code Online (Sandbox Code Playgroud)

或者,使用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("?");
Run Code Online (Sandbox Code Playgroud)

我错过了一些东西.GOT是一种更好的方式.就像是:

代替:

urlString += "u1=" + u1 + ";u2=" + u2 + ";u3=" + u3 + ";u4=" + u4 + ";";
Run Code Online (Sandbox Code Playgroud)

做:

urlString += Interpolator("u1=%s;u2=%s;u3=%s;u4=%s;", u1, u2, u3, u4);
Run Code Online (Sandbox Code Playgroud)

要么:

urlStringBuilder.append(Interpolator("u1=%s;u2=%s;u3=%s;u4=%s;", u1, u2, u3, u4));
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 283

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

urlString += String.format("u1=%s;u2=%s;u3=%s;u4=%s;", u1, u2, u3, u4);
Run Code Online (Sandbox Code Playgroud)

详情Formatter请见.

  • 从 Java 15 开始,您可以直接在字符串实例上使用“formatted”方法,其作用与“String.format”方法相同。例如 `"Print %s".formatted("text")` (6认同)
  • @MiaeKim:完全可以*关注*性能,而无需对代码的每一行进行微优化。我非常关心Noda Time的性能-但例如,抛出异常时我很乐意进行字符串格式化。 (4认同)
  • 如果你关心性能,你应该避免“String.format”。[检查 redfin 中 Java 字符串插值的性能比较](https://redfin.engineering/java-string-concatenation-which-way-is-best-8f590a7d22a8)。 (3认同)
  • @MiaeKim:那么我认为应该将范围更紧密。与“如果您关心性能” IMO相比,“对于性能至关重要的代码段”更有用。谁会说他们作为开发人员不在乎性能?出于性能考虑,要决定在哪里牺牲可读性。 (3认同)
  • 就像您提到的 Noda Time 一样,这完全取决于用例。如果您创建大量日志,String.format 也会产生影响。此评论仅供参考。 (2认同)

Jan*_*nar 76

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

#!/usr/bin/ruby

age = 34
name = "William"

puts "#{name} is #{age} years old" 
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

在Java中,我们使用String.format()方法构建一个新字符串.结果是一样的,但方法不同.

http://en.wikipedia.org/wiki/Variable_interpolation

编辑截至2019年,JEP 326:Raw String Literals提到字符串插值可能会在将来添加到该语言中.

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

JEP 326:原始字符串文字

  • 我想知道为什么插入的字符串不支持/引入Java语言.这似乎是一个非常有用的功能. (24认同)
  • @jackr Python的字符串也是不可变的.然而,"字符串插值"更多地被视为构造一个字符串的一种方式,而不是编辑现有字符串的方式.它没有在java中引入,最有可能是因为其他优先事项.它存在于C#和许多其他语言中更像java. (15认同)
  • @jackr C#非常类似于java处理字符串,并且它具有插值字符串 (10认同)
  • @jackr,如果我们有这个功能,那就太好了,它可以显着提高代码的可读性。关于不变性问题,我坚信这可以在编译时完成;其他语言已经做到了 (4认同)
  • Java字符串是不可变的,无法更改,因此没有"将XXX插入字符串YYY".使用String.format()语义(即创建新字符串)的简化语法(如Ruby#{})将遵循字符串不变性,但运行其他核心Java设计约束. (2认同)

Jim*_*ane 29

只是补充说,还有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);
Run Code Online (Sandbox Code Playgroud)

结果:

At 12:30 PM on Jul 3, 2053, there was a disturbance in the Force on planet 7.
Run Code Online (Sandbox Code Playgroud)

  • **警告**:MessageFormat比字符串连接或`String.format()`慢几个数量级. (16认同)
  • 如果您知道如何使用`String.format()`,即格式标识符的`n $`部分,那么这不应该是一个优势. (4认同)
  • 正如@Adowrath指出的那样,你可以引用索引:`String.format("%2 $ tT on%2 $ tD,行星%1 $ d上有%3 $ s.",星球,新日期() ,event);`[有关更多格式选项,请参阅此处](https://dzone.com/articles/java-string-format-examples) (4认同)

unh*_*ler 17

String.format() 救援!!

  • 那篇文章没有说“避免`String.format`”。我不认为它比它列出的任何其他方法都有更多的缺点。 (5认同)

LEM*_*ANE 6

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

class Client(val firstName: String, val lastName: String) {
    val fullName = "$firstName $lastName"
}
Run Code Online (Sandbox Code Playgroud)

  • 虽然kotlin很好(我经常使用它!)我不确定这与指定java的问题有多相关. (32认同)
  • 仅仅因为它完全可互操作并不意味着你一定想在你的java项目中使用它 (12认同)
  • 使用完全不同的编程语言是 Java 用户的特权吗?这不是一个有用的答案。对于 Java 开发人员来说,它还不如 Ruby 中的好。 (4认同)
  • 是的,它仍然是.有一个Kotlin-Java互操作性.这意味着您可以使用Java代码调用Kotlin代码,反之亦然. (2认同)
  • 是的,但这是 java 用户的特权。:) (2认同)