Gibt es einen String
Ersetzungsmechanismus in Java, bei dem ich Objekte mit einem Text übergeben kann und der die Zeichenfolge ersetzt, sobald sie auftritt?
Der Text lautet beispielsweise:
Hello ${user.name},
Welcome to ${site.name}.
Die Objekte, die ich habe, sind "user"
und "site"
. Ich möchte die darin angegebenen Zeichenfolgen ${}
durch die entsprechenden Werte aus den Objekten ersetzen . Dies entspricht dem Ersetzen von Objekten in einer Geschwindigkeitsvorlage.
String.format("Hello %s", username);
Hello ${user.name}
, not likeHello %s
oderHello {0}
.Antworten:
Verwendung
StringSubstitutor
aus Apache Commons Text.https://commons.apache.org/proper/commons-text/
Es wird es für Sie tun (und seine Open Source ...)
quelle
Map<String, String> valuesMap = new HashMap<String, String>();
.StrSubstitutor
ist jetzt in https://commons.apache.org/proper/commons-lang/ veraltet . Benutzer https://commons.apache.org/proper/commons-text/ stattdessenStrSubstitutor
veraltet ab 1.3,StringSubstitutor
stattdessen verwenden. Diese Klasse wird in 2.0 entfernt. Gradle Abhängigkeit für den ImportStringSubstitutor
istorg.apache.commons:commons-text:1.4
Schauen Sie sich die
java.text.MessageFormat
Klasse an. MessageFormat nimmt eine Reihe von Objekten, formatiert sie und fügt die formatierten Zeichenfolgen an den entsprechenden Stellen in das Muster ein.quelle
format
auchObject...
Varargs verwenden, damit Sie diese knappere Syntax verwenden können, wo dies vorzuziehen istformat("{0} world {1}", "Hello", "!");
MessageFormat
nur für seinen Namensvetter, die Anzeige von Nachrichten und nicht für die Ausgabe, wenn die technische Formatierung wichtig ist, zuverlässig verwendet werden kann. Zahlen werden beispielsweise nach Gebietsschemaeinstellungen formatiert, wodurch sie für technische Zwecke ungültig werden.Mein bevorzugter Weg ist,
String.format()
weil es ein Oneliner ist und keine Bibliotheken von Drittanbietern erfordert:Ich benutze dies regelmäßig, zB in Ausnahmemeldungen wie:
Hinweis: Sie können beliebig viele Variablen eingeben, da Varargs
format()
verwendet wirdquelle
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);
. Bei anderen Antworten muss jedes Argument nur einmal angegeben werden.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)
Ich habe eine kleine Testimplementierung davon zusammengestellt. Die Grundidee besteht darin,
format
die Formatzeichenfolge sowie eine Karte der Objekte und die Namen, die sie lokal haben , aufzurufen und zu übergeben.Die Ausgabe der folgenden ist:
Hinweis: Dies wird aufgrund nicht behandelter Ausnahmen nicht kompiliert. Aber es macht den Code viel einfacher zu lesen.
Ich mag es auch nicht, dass Sie die Map selbst im Code erstellen müssen, aber ich weiß nicht, wie ich die Namen der lokalen Variablen programmgesteuert abrufen kann. Der beste Weg, dies zu tun, besteht darin, daran zu denken, das Objekt in die Karte einzufügen, sobald Sie es erstellen.
Das folgende Beispiel erzeugt die gewünschten Ergebnisse aus Ihrem Beispiel:
Ich sollte auch erwähnen, dass ich keine Ahnung habe, was Geschwindigkeit ist, also hoffe ich, dass diese Antwort relevant ist.
quelle
Hier ist ein Überblick darüber, wie Sie dies tun können. Es sollte relativ einfach sein, es als tatsächlichen Code zu implementieren.
user.name
würde werdenuser
undname
. Suchen Sieuser
in Ihrer Karte nach dem Objekt und verwenden Sie die Reflexion , um den Wert desname
Objekts zu ermitteln. Angenommen, Ihre Objekte haben Standard-Getter, suchen Sie nach einer MethodegetName
und rufen sie auf.quelle
Es gibt einige Expression Language-Implementierungen, die dies für Sie erledigen. Sie können der Verwendung Ihrer eigenen Implementierung vorzuziehen sein, wenn Ihre Anforderungen steigen, siehe beispielsweise JUEL und MVEL
Ich mag und habe MVEL in mindestens einem Projekt erfolgreich eingesetzt.
Siehe auch den Stackflow-Beitrag JSTL / JSP EL (Expression Language) in einem Nicht-JSP-Kontext (Standalone)
quelle
Es gibt nichts, was mit der Geschwindigkeit vergleichbar wäre, da die Geschwindigkeit geschrieben wurde, um genau dieses Problem zu lösen. Das nächste, was Sie versuchen können, ist einen Blick in den Formatierer
http://cupi2.uniandes.edu.co/site/images/recursos/javadoc/j2se/1.5.0/docs/api/java/util/Formatter.html
Soweit ich weiß, wurde der Formatierer jedoch erstellt, um C-ähnliche Formatierungsoptionen in Java bereitzustellen, sodass er möglicherweise nicht genau Ihren Juckreiz zerkratzt, aber Sie können es gerne versuchen :).
quelle
Ich verwende GroovyShell in Java, um Vorlagen mit Groovy GString zu analysieren:
quelle