276 votes

Interpolation de variables de type chaîne de caractères Java

La construction de chaînes en Java me déconcerte. J'ai horreur de faire 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("?");

J'ai sûrement raté quelque chose. Il doit bien y avoir un meilleur moyen. 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));

428voto

Jon Skeet Points 692016

Si vous utilisez Java 5 ou plus, vous pouvez utiliser String.format :

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

Voir Formatter pour les détails.

136voto

Jan Bodnar Points 667

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 à l'intérieur d'une chaîne de caractères. Un exemple en Ruby :

#!/usr/bin/ruby

age = 34
name = "William"

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

L'interpréteur Ruby remplace automatiquement les variables par leurs valeurs dans une chaîne de caractères. Le fait que nous allons faire une interpolation est indiqué par des caractères sigles. En Ruby, c'est #{}. En Perl, il peut s'agir de $, % ou @. Java ne ferait qu'imprimer ces caractères, il ne les développe pas.

L'interpolation variable n'est pas prise en charge par Java. Au lieu de cela, nous formatage des chaînes de caractères.

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/Variable_interpolation

Modifier A partir de 2019, JEP 326 (Raw String Literals) a été retirée et remplacée par de multiples PEC, ce qui a conduit à l'adoption de la norme JEP 378 : Blocs de texte livré dans Java 15.

Un bloc de texte est une chaîne de caractères littérale de plusieurs lignes qui évite la plupart des séquences d'échappement, formate automatiquement la chaîne de manière prévisible et permet au développeur de contrôler le format lorsqu'il le souhaite.

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

Les non-objectifs : Les blocs de texte ne prennent pas directement en charge l'interpolation de chaînes de caractères. L'interpolation pourra être envisagée dans un futur JEP. En attendant, la nouvelle méthode d'instance String::formatted aide dans les situations où l'interpolation peut être souhaitée.

47voto

Jimmy Kane Points 3808

J'ajoute qu'il y a aussi java.text.MessageFormat avec l'avantage d'avoir des index d'arguments numériques.

Ajout du 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.

20voto

unholysampler Points 9454

String.format() à la rescousse !

0voto

Lemuel Adane Points 799

Vous pouvez utiliser Kotlin, le super (cédé de) Java pour JVM, il a une belle façon d'interpoler les chaînes de caractères comme ceux de ES5, Ruby et Python.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X