Czy String
w Javie istnieje mechanizm zastępujący, w którym mogę przekazywać obiekty tekstem i zastępuje ciąg, gdy się pojawia.
Na przykład tekst to:
Hello ${user.name},
Welcome to ${site.name}.
Obiekty, które mam, to "user"
i "site"
. Chcę zamienić ciągi podane w środku na ${}
ich odpowiedniki z obiektów. To samo, co zamieniamy obiekty w szablonie prędkości.
String.format("Hello %s", username);
Hello ${user.name}
, not likeHello %s
lubHello {0}
.Odpowiedzi:
Użyj
StringSubstitutor
z Apache Commons Text.https://commons.apache.org/proper/commons-text/
Zrobi to za Ciebie (i jego open source ...)
źródło
Map<String, String> valuesMap = new HashMap<String, String>();
.StrSubstitutor
jest teraz przestarzała w https://commons.apache.org/proper/commons-lang/ . Zamiast tego użytkownik https://commons.apache.org/proper/commons-text/StrSubstitutor
przestarzałe od 1.3, użyjStringSubstitutor
zamiast tego. Ta klasa zostanie usunięta w wersji 2.0. Zależność Gradle dla importowaniaStringSubstitutor
toorg.apache.commons:commons-text:1.4
Przyjrzyj się
java.text.MessageFormat
klasie, MessageFormat pobiera zestaw obiektów, formatuje je, a następnie wstawia sformatowane ciągi do wzorca w odpowiednich miejscach.źródło
format
bierze równieżObject...
varargs więc można użyć tej składni bardziej lakoniczny gdzie preferowaneformat("{0} world {1}", "Hello", "!");
MessageFormat
może być niezawodnie używany tylko do jego nazwy, wyświetlania komunikatów, a nie do wyjścia, w którym ważne jest formatowanie techniczne. Na przykład liczby zostaną sformatowane zgodnie z ustawieniami regionalnymi, co sprawi, że będą nieprawidłowe do zastosowań technicznych.Preferuję sposób,
String.format()
ponieważ jest to oneliner i nie wymaga bibliotek innych firm:Używam tego regularnie, np. W komunikatach o wyjątkach, takich jak:
Wskazówka: możesz wprowadzić tyle zmiennych, ile chcesz, ponieważ
format()
używa Varargsźródło
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);
. : . Inne odpowiedzi wymagają podania każdego argumentu tylko raz.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)
Wrzuciłem razem małą testową implementację tego. Podstawową ideą jest wywołanie
format
i przekazanie ciągu formatu oraz mapy obiektów i nazw, które mają lokalnie.Wynik następujących działań to:
Uwaga: nie kompiluje się z powodu nieobsłużonych wyjątków. Ale dzięki temu kod jest znacznie łatwiejszy do odczytania.
Nie podoba mi się również to, że musisz sam konstruować mapę w kodzie, ale nie wiem, jak programowo uzyskać nazwy zmiennych lokalnych. Najlepszym sposobem na to jest pamiętanie o umieszczeniu obiektu na mapie zaraz po jego utworzeniu.
Poniższy przykład daje wyniki, które chcesz z przykładu:
Powinienem również wspomnieć, że nie mam pojęcia, czym jest Velocity, więc mam nadzieję, że ta odpowiedź jest odpowiednia.
źródło
Oto zarys tego, jak możesz się do tego zabrać. Wdrożenie go jako rzeczywistego kodu powinno być stosunkowo proste.
user.name
stanie sięuser
iname
. Spójrzuser
na mapę, aby uzyskać obiekt i użyj odbicia, aby uzyskać wartośćname
z obiektu. Zakładając, że twoje obiekty mają standardowe metody pobierające, będziesz szukać metodygetName
i wywołać ją.źródło
Istnieje kilka implementacji języka wyrażeń, które robią to za Ciebie, mogą być lepsze niż używanie własnej implementacji, gdy Twoje wymagania rosną, zobacz na przykład JUEL i MVEL
Podoba mi się i z powodzeniem wykorzystałem MVEL w co najmniej jednym projekcie.
Zobacz także Stackflow post JSTL / JSP EL (język wyrażeń) w kontekście innym niż JSP (autonomiczny)
źródło
Nie ma nic poza pudełkiem, co byłoby porównywalne z prędkością, ponieważ prędkość została napisana, aby rozwiązać dokładnie ten problem. Najbliższą rzeczą, jaką możesz spróbować, jest zajrzenie do programu Formatter
http://cupi2.uniandes.edu.co/site/images/recursos/javadoc/j2se/1.5.0/docs/api/java/util/Formatter.html
Jednak program formatujący, o ile wiem, został stworzony, aby zapewnić opcje formatowania podobne do C w Javie, więc może nie zarysować dokładnie twojego swędzenia, ale możesz spróbować :).
źródło
Używam GroovyShell w java do parsowania szablonu z Groovy GString:
źródło