¿Existe algún Stringmecanismo 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 %soHello {0}.Respuestas:
Utilizar
StringSubstitutordesde 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>();.StrSubstitutorahora está en desuso en https://commons.apache.org/proper/commons-lang/ . Usuario https://commons.apache.org/proper/commons-text/ en su lugarStrSubstitutorobsoleto a partir de 1.3, utiliceStringSubstitutoren su lugar. Esta clase se eliminará en 2.0. La dependencia de Gradle para la importaciónStringSubstitutoresorg.apache.commons:commons-text:1.4Eche un vistazo a la
java.text.MessageFormatclase, MessageFormat toma un conjunto de objetos, los formatea y luego inserta las cadenas formateadas en el patrón en los lugares apropiados.fuente
formattambién toma unObject...varargs para que pueda usar esta sintaxis más concisa donde sea preferibleformat("{0} world {1}", "Hello", "!");MessageFormatsolo 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
formaty 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.namese convertiría enuseryname. Busqueuseren su mapa para obtener el objeto y use la reflexión para obtener el valor delnameobjeto. Suponiendo que sus objetos tengan captadores estándar, buscará un métodogetNamey 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