Existe-t-il un String
mécanisme de remplacement en Java, où je peux passer des objets avec un texte, et il remplace la chaîne au fur et à mesure qu'elle se produit.
Par exemple, le texte est:
Hello ${user.name},
Welcome to ${site.name}.
Les objets que j'ai sont "user"
et "site"
. Je veux remplacer les chaînes données à l'intérieur ${}
par ses valeurs équivalentes à partir des objets. C'est la même chose que nous remplaçons des objets dans un modèle de vitesse.
String.format("Hello %s", username);
Hello ${user.name}
, pas comme,Hello %s
ouHello {0}
.Réponses:
Utilisation à
StringSubstitutor
partir du texte Apache Commons.https://commons.apache.org/proper/commons-text/
Il le fera pour vous (et son open source ...)
la source
Map<String, String> valuesMap = new HashMap<String, String>();
.StrSubstitutor
est désormais obsolète dans https://commons.apache.org/proper/commons-lang/ . Utilisateur https://commons.apache.org/proper/commons-text/ à la placeStrSubstitutor
obsolète depuis la 1.3, utilisez à laStringSubstitutor
place. Cette classe sera supprimée dans la version 2.0. La dépendance Gradle pour l'importationStringSubstitutor
estorg.apache.commons:commons-text:1.4
Jetez un œil à la
java.text.MessageFormat
classe, MessageFormat prend un ensemble d'objets, les met en forme, puis insère les chaînes formatées dans le modèle aux endroits appropriés.la source
format
prend également unObject...
varargs afin que vous puissiez utiliser cette syntaxe plus concise là où c'est préférableformat("{0} world {1}", "Hello", "!");
MessageFormat
ne peut être utilisé de manière fiable que pour son homonyme, afficher les messages, pas pour la sortie où le formatage technique est important. Les nombres, par exemple, seront formatés selon les paramètres régionaux, les rendant invalides pour des utilisations techniques.Ma méthode préférée est
String.format()
parce que c'est un oneliner et ne nécessite pas de bibliothèques tierces:Je l'utilise régulièrement, par exemple dans des messages d'exception comme:
Astuce: vous pouvez insérer autant de variables que vous le souhaitez car
format()
utilise Varargsla source
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);
. D'autres réponses ici nécessitent de spécifier chaque argument une seule fois.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)
J'ai jeté ensemble un petit test de mise en œuvre de cela. L'idée de base est d'appeler
format
et de transmettre la chaîne de format, une carte des objets et les noms qu'ils ont localement.Le résultat de ce qui suit est:
Remarque: cela ne compile pas en raison d'exceptions non gérées. Mais cela rend le code beaucoup plus facile à lire.
De plus, je n'aime pas que vous deviez construire la carte vous-même dans le code, mais je ne sais pas comment obtenir les noms des variables locales par programme. La meilleure façon de le faire est de ne pas oublier de mettre l'objet dans la carte dès que vous le créez.
L'exemple suivant produit les résultats souhaités à partir de votre exemple:
Je devrais également mentionner que je n'ai aucune idée de ce qu'est Velocity, donc j'espère que cette réponse est pertinente.
la source
Voici un aperçu de la façon dont vous pourriez procéder. Il devrait être relativement simple de l'implémenter en tant que code réel.
user.name
deviendraituser
etname
. Recherchezuser
dans votre carte pour obtenir l'objet et utilisez la réflexion pour obtenir la valeur de àname
partir de l'objet. En supposant que vos objets ont des getters standard, vous chercherez une méthodegetName
et vous l'appelerez.la source
Il existe quelques implémentations de langage d'expression qui le font pour vous, cela pourrait être préférable à l'utilisation de votre propre implémentation au fur et à mesure que vos besoins augmentent, voir par exemple JUEL et MVEL
J'aime et j'ai utilisé avec succès MVEL dans au moins un projet.
Voir également le Stackflow post JSTL / JSP EL (Expression Language) dans un contexte non JSP (autonome)
la source
Il n'y a rien hors de la boîte qui soit comparable à la vitesse puisque la vitesse a été écrite pour résoudre exactement ce problème. La chose la plus proche que vous pouvez essayer est de regarder dans le formateur
http://cupi2.uniandes.edu.co/site/images/recursos/javadoc/j2se/1.5.0/docs/api/java/util/Formatter.html
Cependant, pour autant que je sache, le formateur a été créé pour fournir des options de formatage de type C en Java, de sorte qu'il ne vous gratte peut-être pas exactement, mais vous êtes invités à essayer :).
la source
J'utilise GroovyShell en java pour analyser le modèle avec Groovy GString:
la source