Interpolación variable de cadena Java

La construcción de cadenas en Java me confunde. Me aventuro a hacer cosas como las siguientes:

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

SURELY 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 usa Java 5 o una String.format superior, puede usar 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 hay interpolación variable en Java. La interpolación variable es la sustitución variable con su valor dentro de una cadena. Un ejemplo en Ruby:

 #!/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 interpolación está sugerido por los caracteres sigil. En Ruby, es # {}. En Perl, podría ser $,% o @. Java solo imprimiría tales caracteres, no los expandiría.

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

 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

Solo para agregar que también hay java.text.MessageFormat con la ventaja de tener índices de argumento numérico.

Anexando 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 !!

Puede usar Kotlin, el Super (cede of) Java for JVM, tiene una forma agradable de interpolar cadenas como las de ES5, Ruby y Python.

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