Existe algum String
mecanismo de substituição em Java, onde posso passar objetos com um texto, e ele substitui a string conforme ela ocorre.
Por exemplo, o texto é:
Hello ${user.name},
Welcome to ${site.name}.
Os objetos que tenho são "user"
e "site"
. Quero substituir as strings fornecidas ${}
por seus valores equivalentes dos objetos. Isso é o mesmo que substituímos objetos em um modelo de velocidade.
String.format("Hello %s", username);
Hello ${user.name}
, não semelhanteHello %s
ouHello {0}
.Respostas:
Use
StringSubstitutor
do texto do Apache Commons.https://commons.apache.org/proper/commons-text/
Ele fará isso por você (e seu código aberto ...)
fonte
Map<String, String> valuesMap = new HashMap<String, String>();
.StrSubstitutor
agora está obsoleto em https://commons.apache.org/proper/commons-lang/ . Usuário https://commons.apache.org/proper/commons-text/ vezStrSubstitutor
obsoleto a partir de 1.3, use em seuStringSubstitutor
lugar. Esta classe será removida em 2.0. Dependência do Gradle para importaçãoStringSubstitutor
éorg.apache.commons:commons-text:1.4
Dê uma olhada na
java.text.MessageFormat
classe, MessageFormat pega um conjunto de objetos, formata-os e, em seguida, insere as strings formatadas no padrão nos locais apropriados.fonte
format
também leva umObject...
varargs para que você possa usar esta sintaxe mais concisa onde preferirformat("{0} world {1}", "Hello", "!");
MessageFormat
só pode ser usado de forma confiável para mensagens de exibição de seu homônimo, não para saída onde a formatação técnica é importante. Os números, por exemplo, serão formatados de acordo com as configurações locais, tornando-os inválidos para usos técnicos.Minha maneira preferida é
String.format()
porque é oneliner e não requer bibliotecas de terceiros:Eu uso isso regularmente, por exemplo, em mensagens de exceção como:
Dica: você pode inserir quantas variáveis quiser porque
format()
usa Varargsfonte
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);
. Outras respostas aqui requerem a especificação de cada argumento apenas uma 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)
Eu fiz um pequeno teste de implementação disso. A ideia básica é chamar
format
e passar a string de formato, um mapa de objetos e os nomes que eles possuem localmente.O resultado do seguinte é:
Observação: isso não é compilado devido a exceções não tratadas. Mas torna o código muito mais fácil de ler.
Além disso, não gosto que você tenha que construir o mapa sozinho no código, mas não sei como obter os nomes das variáveis locais programaticamente. A melhor maneira de fazer isso é lembrar de colocar o objeto no mapa assim que criá-lo.
O exemplo a seguir produz os resultados que você deseja do seu exemplo:
Devo também mencionar que não tenho ideia do que é velocidade, então espero que esta resposta seja relevante.
fonte
Aqui está um esboço de como você poderia fazer isso. Deve ser relativamente simples implementá-lo como código real.
user.name
se tornariauser
ename
. Procureuser
em seu mapa para obter o objeto e use a reflexão para obter o valor dename
do objeto. Supondo que seus objetos tenham getters padrão, você procurará um métodogetName
e o chamará .fonte
Existem algumas implementações de Expression Language por aí que fazem isso para você, pode ser preferível usar sua própria implementação conforme ou se seus requisitos aumentarem, consulte por exemplo JUEL e MVEL
Eu gosto e tenho usado o MVEL com sucesso em pelo menos um projeto.
Veja também a postagem JSTL / JSP EL (linguagem de expressão) do Stackflow em um contexto não JSP (autônomo)
fonte
Não há nada fora da caixa que seja comparável à velocidade, já que a velocidade foi escrita para resolver exatamente esse problema. A coisa mais próxima que você pode tentar é olhar para o Formatador
http://cupi2.uniandes.edu.co/site/images/recursos/javadoc/j2se/1.5.0/docs/api/java/util/Formatter.html
No entanto, o formatador, até onde eu sei, foi criado para fornecer opções de formatação semelhantes ao C em Java, então ele pode não arranhar exatamente a sua coceira, mas você pode tentar :).
fonte
Eu uso GroovyShell em java para analisar o modelo com Groovy GString:
fonte