web-dev-qa-db-ja.com

文字列変数の補間Java

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

Java 5以上を使用している場合は、 String.format を使用できます。

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

詳細については、 Formatter を参照してください。

263
Jon Skeet

Javaには変数補間がないことに注意してください。変数補間は、文字列内の値を使用した変数置換です。 Rubyの例:

#!/usr/bin/Ruby

age = 34
name = "William"

puts "#{name} is #{age} years old" 

Rubyインタープリターは、変数をストリング内の値に自動的に置き換えます。補間を行うという事実は、シギル文字によって示唆されます。 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 を参照してください

Edit2019年現在、 JEP 326 (Raw String Literals)は撤回され、 JEP 355 =(テキストブロック)。後者は、言語に「テキストブロック」を導入しようとします。

テキストブロックは複数行の文字列リテラルであり、ほとんどのエスケープシーケンスの必要性を回避し、予測可能な方法で文字列を自動的にフォーマットし、必要に応じて開発者がフォーマットを制御できるようにします。

ただし、文字列補間はまだありません

非目標:テキストブロックは、文字列の補間を直接サポートしていません。補間は、将来のJEPで検討される可能性があります。

72
Jan Bodnar

それに加えて、数値引数インデックスを持つという利点がある 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.
29
Jimmy Kane

String.format() 救助に!!

17
unholysampler

JVMのスーパー(コード)JavaであるKotlinを使用できます。ES5、RubyおよびPythonのような文字列を補間するニースの方法があります。

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