2011-06-17 99 views
91

Java中的字符串混淆了我。我abhore做這樣的事情:字符串變量插值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("?"); 

肯定我失去了一些東西。有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)); 
+1

String.format for print style或velocity for more general string templating – Kevin

+5

10什麼是速度? – cmcculloh

回答

181

如果你正在使用Java 5或更高版本,可以使用String.format

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

查看Formatter瞭解詳情。

52

請注意,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

+7

我想知道爲什麼內插字符串不支持/引入Java語言。這似乎是一個非常有用的功能。 – Hervian

+1

Java字符串是不可變的,不能更改,所以沒有「將XXX插入字符串YYY」。使用String.format()語義(即創建新字符串)的簡化語法(如Ruby#{})將尊重String不變性,但會運行其他核心Java設計約束。 – jackr

+4

@jackr Python的字符串也是不可變的。然而,「字符串插值」可以被看作是構建一個字符串的一種方式,而不是一種編輯現有字符串的方式。由於其他優先事項,最有可能沒有引入java。它存在於C#和許多其他類似java的語言中。 –

15

我想補充的是還有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. 
+4

**警告**:MessageFormat比字符串連接或'String.format()'慢幾個數量級。 – ccpizza

+1

如果你知道如何使用'String.format()',也就是格式標識符的'n $'部分,這應該不會有太大的優勢。 – Adowrath

+1

As @Adowrath指出,你可以參考指數: 'String.format( 「at%2 $ tT on%2 $ tD,%1 $ d%3 $ s。」, planet,新的日期(),事件);'[在這裏看到更多的格式化選項](https://dzone.com/articles/java-string-format-examples) – ecoe

5

您可以使用科特林,超級(的半寸)的Java的JVM,它有內插字符串的一個很好的方式就像ES5,Ruby和Python一樣。

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

雖然kotlin是不錯的(我用它很多!)我我不確定這與指定java的問題有多相關。 – Restioson

+0

是的,它仍然是。有一個Kotlin-Java互操作性。這意味着你可以用Java代碼調用Kotlin代碼,反之亦然。 –

+3

只是因爲它完全可互操作並不意味着你一定想在你的java項目中使用它 – Restioson