web-dev-qa-db-fra.com

Interpolation de variable de chaîne Java

La construction de chaînes dans Java me gêne. Je débarque en faisant des choses comme:

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 + "?";

Ou, en utilisant StringBuilder, quelque chose comme ceci:

    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("?");

Sûrement je manque quelque chose. Il doit y avoir une meilleure façon. Quelque chose comme:

Au lieu de:

urlString += "u1=" + u1 + ";u2=" + u2 + ";u3=" + u3 + ";u4=" + u4 + ";";

faire:

urlString += Interpolator("u1=%s;u2=%s;u3=%s;u4=%s;", u1, u2, u3, u4);

ou:

urlStringBuilder.append(Interpolator("u1=%s;u2=%s;u3=%s;u4=%s;", u1, u2, u3, u4));
143
cmcculloh

Si vous utilisez Java 5 ou une version supérieure, vous pouvez utiliser String.format :

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

Voir Formatter pour plus de détails.

263
Jon Skeet

Notez qu'il n'y a pas d'interpolation de variable en Java. L'interpolation de variable est une substitution de variable avec sa valeur dans une chaîne. Un exemple en Ruby:

#!/usr/bin/Ruby

age = 34
name = "William"

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

L'interprète Ruby remplace automatiquement les variables par ses valeurs dans une chaîne. Le fait que nous allons effectuer une interpolation est indiqué par des caractères de sceau. En Ruby, c'est # {}. En Perl, cela pourrait être $,% ou @. Java n'imprimerait que de tels caractères, il ne les développerait pas.

L'interpolation de variable n'est pas prise en charge en Java. Au lieu de cela, nous avons un formatage de chaîne.

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);
    }
}

En Java, nous construisons une nouvelle chaîne en utilisant la méthode String.format (). Le résultat est le même, mais les méthodes sont différentes.

Voir http://en.wikipedia.org/wiki/interpolation_Variable

Modifier À compter de 2019, JEP 326 (chaînes brutes) a été retiré et remplacé par JEP 355 = (Blocs de texte). Ce dernier tente d’introduire des "blocs de texte" dans la langue:

Un bloc de texte est un littéral de chaîne multiligne qui évite le recours à la plupart des séquences d'échappement, formate automatiquement la chaîne de manière prévisible et donne au développeur le contrôle du format, le cas échéant.

Cependant, toujours pas d'interpolation de chaîne :

Non-objectifs: Les blocs de texte ne prennent pas directement en charge l'interpolation de chaîne. L'interpolation peut être envisagée dans un futur PEC.

72
Jan Bodnar

Juste pour ajouter qu'il existe aussi Java.text.MessageFormat avec l'avantage d'avoir des index d'arguments numériques.

Ajouter le 1er exemple de la documentation

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

Résultat:

At 12:30 PM on Jul 3, 2053, there was a disturbance in the Force on planet 7.
29
Jimmy Kane

String.format() à la rescousse !!

17
unholysampler

Vous pouvez utiliser Kotlin, le Super (cede of) Java pour la machine virtuelle Java (JVM). Il permet d’interpoler des chaînes comme celles de ES5, Ruby et Python.

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