Apakah ada String
mekanisme penggantian di Java, di mana saya bisa melewatkan objek dengan teks, dan itu menggantikan string saat terjadi.
Misalnya, teksnya adalah:
Hello ${user.name},
Welcome to ${site.name}.
Objek yang saya miliki adalah "user"
dan "site"
. Saya ingin mengganti string yang diberikan di dalam ${}
dengan nilai yang setara dari objek. Ini sama seperti kita mengganti objek dalam templat kecepatan.
String.format("Hello %s", username);
Hello ${user.name}
, bukan seperti,Hello %s
atauHello {0}
.Jawaban:
Gunakan
StringSubstitutor
dari Teks Apache Commons.https://commons.apache.org/proper/commons-text/
Ini akan melakukannya untuk Anda (dan open source ...)
sumber
Map<String, String> valuesMap = new HashMap<String, String>();
.StrSubstitutor
sekarang tidak digunakan lagi di https://commons.apache.org/proper/commons-lang/ . Pengguna https://commons.apache.org/proper/commons-text/ sebagai gantinyaStrSubstitutor
tidak digunakan lagi pada 1.3, gunakanStringSubstitutor
saja. Kelas ini akan dihapus di 2.0. Ketergantungan Gradle untuk imporStringSubstitutor
adalahorg.apache.commons:commons-text:1.4
Lihat
java.text.MessageFormat
kelasnya, MessageFormat mengambil sekumpulan objek, memformatnya, lalu menyisipkan string yang telah diformat ke dalam pola di tempat yang sesuai.sumber
format
juga menggunakanObject...
vararg sehingga Anda dapat menggunakan sintaks yang lebih singkat ini jika lebih disukaiformat("{0} world {1}", "Hello", "!");
MessageFormat
hanya dapat digunakan dengan andal untuk senama, menampilkan pesan, bukan untuk keluaran di mana pemformatan teknis penting. Misalnya, angka akan diformat per pengaturan lokal, menjadikannya tidak valid untuk penggunaan teknis.Cara yang saya sukai adalah
String.format()
karena ini oneliner dan tidak memerlukan perpustakaan pihak ketiga:Saya menggunakan ini secara teratur, misalnya dalam pesan pengecualian seperti:
Petunjuk: Anda dapat memasukkan variabel sebanyak yang Anda suka karena
format()
menggunakan Varargssumber
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);
. Jawaban-jawaban lain di sini hanya perlu menentukan setiap argumen sekali.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)
Saya mengumpulkan implementasi tes kecil ini. Ide dasarnya adalah memanggil
format
dan meneruskan dalam format string, dan peta objek, dan nama yang mereka miliki secara lokal.Output dari berikut ini adalah:
Catatan: Ini tidak dapat dikompilasi karena pengecualian yang tidak tertangani. Tapi itu membuat kode lebih mudah dibaca.
Selain itu, saya tidak suka Anda harus membuat sendiri peta dalam kode, tetapi saya tidak tahu cara mendapatkan nama variabel lokal secara terprogram. Cara terbaik untuk melakukannya, adalah dengan mengingat untuk meletakkan objek di peta segera setelah Anda membuatnya.
Contoh berikut menghasilkan hasil yang Anda inginkan dari contoh Anda:
Saya juga harus menyebutkan bahwa saya tidak tahu apa itu Velocity, jadi saya harap jawaban ini relevan.
sumber
Berikut adalah garis besar bagaimana Anda bisa melakukan ini. Ini harus relatif mudah untuk menerapkannya sebagai kode sebenarnya.
user.name
akan menjadiuser
danname
. Cariuser
di peta Anda untuk mendapatkan objek dan gunakan refleksi untuk mendapatkan nilai dariname
objek tersebut. Dengan asumsi objek Anda memiliki getter standar, Anda akan mencari metodegetName
dan memanggilnya.sumber
Ada beberapa implementasi Bahasa Ekspresi di luar sana yang melakukan ini untuk Anda, mungkin lebih baik daripada menggunakan implementasi Anda sendiri jika atau jika persyaratan Anda bertambah, lihat misalnya JUEL dan MVEL
Saya suka dan telah berhasil menggunakan MVEL setidaknya dalam satu proyek.
Juga lihat posting Stackflow JSTL / JSP EL (Expression Language) dalam konteks non JSP (standalone)
sumber
Tidak ada di luar kotak yang sebanding dengan kecepatan sejak kecepatan ditulis untuk menyelesaikan masalah itu dengan tepat. Hal terdekat yang dapat Anda coba adalah melihat ke Formatter
http://cupi2.uniandes.edu.co/site/images/recursos/javadoc/j2se/1.5.0/docs/api/java/util/Formatter.html
Namun pemformat sejauh yang saya tahu dibuat untuk menyediakan opsi pemformatan seperti C di Java sehingga mungkin tidak menggores Anda secara persis, tetapi Anda dipersilakan untuk mencoba :).
sumber
Saya menggunakan GroovyShell di java untuk mengurai template dengan Groovy GString:
sumber