Interpolación de variables de cadena Java [duplicado]

Resuelto cmcculloh asked hace 13 años • 5 respuestas

La construcción de cadenas en Java me confunde. Detesto hacer cosas como:

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

O, usando StringBuilder, algo como esto:

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

SEGURAMENTE me estoy perdiendo algo. Tiene que haber una mejor manera. Algo como:

En lugar de:

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

hacer:

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

o:

urlStringBuilder.append(Interpolator("u1=%s;u2=%s;u3=%s;u4=%s;", u1, u2, u3, u4));
cmcculloh avatar Jun 18 '11 00:06 cmcculloh
Aceptado

Si está utilizando Java 5 o superior, puede utilizar String.format:

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

Ver Formatterpara más detalles.

Jon Skeet avatar Jun 17 '2011 18:06 Jon Skeet

Tenga en cuenta que no existe interpolación de variables en Java. La interpolación de variables es la sustitución de variables con su valor dentro de una cadena. Un ejemplo en Rubí:

#!/usr/bin/ruby

age = 34
name = "William"

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

El intérprete de Ruby reemplaza automáticamente las variables con sus valores dentro de una cadena. El hecho de que vamos a hacer una interpolación se insinúa mediante caracteres sigilos. En Ruby, es #{}. En Perl, podría ser $, % o @. Java sólo imprimiría esos caracteres, no los expandiría.

La interpolación de variables no es compatible con Java. En lugar de esto, tenemos formato de cadena.

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, construimos una nueva cadena usando el método String.format(). El resultado es el mismo, pero los métodos son diferentes.

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

Editar A partir de 2019, JEP 326 (Raw String Literals) fue retirado y reemplazado por múltiples JEP que eventualmente llevaron a JEP 378: Bloques de texto entregados en Java 15.

Un bloque de texto es un literal de cadena de varias líneas que evita la necesidad de la mayoría de secuencias de escape, formatea automáticamente la cadena de una manera predecible y le da al desarrollador control sobre el formato cuando lo desee.

Sin embargo, todavía no hay interpolación de cadenas :

No objetivos: … Los bloques de texto no admiten directamente la interpolación de cadenas. La interpolación podrá considerarse en una futura PEC. Mientras tanto, el nuevo método de instancia String::formattedayuda en situaciones en las que se pueda desear la interpolación.

Jan Bodnar avatar Jun 21 '2013 10:06 Jan Bodnar

Solo para agregar que también existe java.text.MessageFormat con la ventaja de tener índices de argumentos numéricos.

Adjuntando el primer ejemplo de la documentación.

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

Resultado:

At 12:30 PM on Jul 3, 2053, there was a disturbance in the Force on planet 7.
Jimmy Kane avatar Apr 08 '2016 11:04 Jimmy Kane

String.format()¡¡al rescate!!

unholysampler avatar Jun 17 '2011 18:06 unholysampler