¿Existe algún String
mecanismo de reemplazo en Java, donde pueda pasar objetos con un texto, y reemplaza la cadena a medida que ocurre?
Por ejemplo, el texto es:
Hello ${user.name},
Welcome to ${site.name}.
Los objetos que tengo son "user"
y "site"
. Quiero reemplazar las cadenas dadas en el interior ${}
con sus valores equivalentes de los objetos. Esto es lo mismo que reemplazamos objetos en una plantilla de velocidad.
String.format("Hello %s", username);
Hello ${user.name}
, no comoHello %s
oHello {0}
.Respuestas:
Utilizar
StringSubstitutor
desde Apache Commons Text.https://commons.apache.org/proper/commons-text/
Lo hará por ti (y su código abierto ...)
fuente
Map<String, String> valuesMap = new HashMap<String, String>();
.StrSubstitutor
ahora está en desuso en https://commons.apache.org/proper/commons-lang/ . Usuario https://commons.apache.org/proper/commons-text/ en su lugarStrSubstitutor
obsoleto a partir de 1.3, utiliceStringSubstitutor
en su lugar. Esta clase se eliminará en 2.0. La dependencia de Gradle para la importaciónStringSubstitutor
esorg.apache.commons:commons-text:1.4
Eche un vistazo a la
java.text.MessageFormat
clase, MessageFormat toma un conjunto de objetos, los formatea y luego inserta las cadenas formateadas en el patrón en los lugares apropiados.fuente
format
también toma unObject...
varargs para que pueda usar esta sintaxis más concisa donde sea preferibleformat("{0} world {1}", "Hello", "!");
MessageFormat
solo se puede usar de manera confiable para su homónimo, mostrar mensajes, no para la salida donde el formato técnico importa. Por ejemplo, los números se formatearán según la configuración regional, lo que los invalidará para usos técnicos.Mi forma preferida es
String.format()
porque es un delineador y no requiere bibliotecas de terceros:Lo uso regularmente, por ejemplo, en mensajes de excepción como:
Sugerencia: puede ingresar tantas variables como desee porque
format()
usa Varargsfuente
String.format("Hello! My name is %s, I'm %s. Why is my name %s you ask? Well I'm only %s years old so I don't know", name, age, name, age);
. Otras respuestas aquí requieren especificar cada argumento solo una vez.String.format("Hello! My name is %1$s, I'm %2$s. Why is my name %1$s you ask? Well I'm only %2$s years old so I don't know", name, age)
Reuní una pequeña implementación de prueba de esto. La idea básica es llamar
format
y pasar la cadena de formato, un mapa de objetos y los nombres que tienen localmente.El resultado de lo siguiente es:
Nota: Esto no se compila debido a excepciones no controladas. Pero hace que el código sea mucho más fácil de leer.
Además, no me gusta que tenga que construir el mapa usted mismo en el código, pero no sé cómo obtener los nombres de las variables locales mediante programación. La mejor manera de hacerlo es recordar poner el objeto en el mapa tan pronto como lo cree.
El siguiente ejemplo produce los resultados que desea de su ejemplo:
También debo mencionar que no tengo idea de qué es Velocity, así que espero que esta respuesta sea relevante.
fuente
Aquí hay un resumen de cómo podría hacer esto. Debería ser relativamente sencillo implementarlo como código real.
user.name
se convertiría enuser
yname
. Busqueuser
en su mapa para obtener el objeto y use la reflexión para obtener el valor delname
objeto. Suponiendo que sus objetos tengan captadores estándar, buscará un métodogetName
y lo invocará.fuente
Hay un par de implementaciones de lenguaje de expresión que hacen esto por usted, podrían ser preferibles a usar su propia implementación a medida que sus requisitos crezcan, consulte, por ejemplo, JUEL y MVEL.
Me gusta y he utilizado con éxito MVEL en al menos un proyecto.
Consulte también la publicación de Stackflow JSTL / JSP EL (lenguaje de expresión) en un contexto no JSP (independiente)
fuente
No hay nada fuera de la caja que sea comparable a la velocidad, ya que la velocidad se escribió para resolver exactamente ese problema. Lo más cercano que puede intentar es buscar en el formateador
http://cupi2.uniandes.edu.co/site/images/recursos/javadoc/j2se/1.5.0/docs/api/java/util/Formatter.html
Sin embargo, hasta donde yo sé, el formateador se creó para proporcionar opciones de formato similares a C en Java, por lo que es posible que no te rasque exactamente lo que te pica, pero puedes probar :).
fuente
Yo uso GroovyShell en Java para analizar la plantilla con Groovy GString:
fuente