Interpolación de variables de cadena Java [duplicado]
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));
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 Formatter
para más detalles.
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::formatted
ayuda en situaciones en las que se pueda desear la interpolación.
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.
String.format()
¡¡al rescate!!