Ini adalah pertanyaan yang sangat umum, jadi saya memutuskan untuk mengubah jawaban ini menjadi artikel juga .
Java 13 dan selanjutnya
Multiline Strings sekarang didukung di Jawa melalui Blok Teks . Di Java 13 dan 14, fitur ini mengharuskan Anda untuk mengatur ––enable–preview
opsi saat membangun dan menjalankan proyek Anda. Lihat dokumentasi Java ini untuk lebih jelasnya.
Sekarang, sebelum Java 13, ini adalah bagaimana Anda akan menulis kueri:
List<Tuple> posts = entityManager
.createNativeQuery(
"SELECT *\n" +
"FROM (\n" +
" SELECT *,\n" +
" dense_rank() OVER (\n" +
" ORDER BY \"p.created_on\", \"p.id\"\n" +
" ) rank\n" +
" FROM (\n" +
" SELECT p.id AS \"p.id\",\n" +
" p.created_on AS \"p.created_on\",\n" +
" p.title AS \"p.title\",\n" +
" pc.id as \"pc.id\",\n" +
" pc.created_on AS \"pc.created_on\",\n" +
" pc.review AS \"pc.review\",\n" +
" pc.post_id AS \"pc.post_id\"\n" +
" FROM post p\n" +
" LEFT JOIN post_comment pc ON p.id = pc.post_id\n" +
" WHERE p.title LIKE :titlePattern\n" +
" ORDER BY p.created_on\n" +
" ) p_pc\n" +
") p_pc_r\n" +
"WHERE p_pc_r.rank <= :rank\n",
Tuple.class)
.setParameter("titlePattern", "High-Performance Java Persistence %")
.setParameter("rank", 5)
.getResultList();
Berkat Blok Teks Java 13, Anda dapat menulis ulang kueri ini sebagai berikut:
List<Tuple> posts = entityManager
.createNativeQuery("""
SELECT *
FROM (
SELECT *,
dense_rank() OVER (
ORDER BY "p.created_on", "p.id"
) rank
FROM (
SELECT p.id AS "p.id",
p.created_on AS "p.created_on",
p.title AS "p.title",
pc.id as "pc.id",
pc.created_on AS "pc.created_on",
pc.review AS "pc.review",
pc.post_id AS "pc.post_id"
FROM post p
LEFT JOIN post_comment pc ON p.id = pc.post_id
WHERE p.title LIKE :titlePattern
ORDER BY p.created_on
) p_pc
) p_pc_r
WHERE p_pc_r.rank <= :rank
""",
Tuple.class)
.setParameter("titlePattern", "High-Performance Java Persistence %")
.setParameter("rank", 5)
.getResultList();
Jauh lebih mudah dibaca, bukan?
Dukungan IDE
IntelliJ IDEA menyediakan dukungan untuk mengubah String
blok gabungan legacy ke String
format multiline baru :
JSON, HTML, XML
Multiline String
sangat berguna saat menulis JSON, HTML, atau XML.
Pertimbangkan contoh ini menggunakan String
penggabungan untuk membangun string literal JSON:
entityManager.persist(
new Book()
.setId(1L)
.setIsbn("978-9730228236")
.setProperties(
"{" +
" \"title\": \"High-Performance Java Persistence\"," +
" \"author\": \"Vlad Mihalcea\"," +
" \"publisher\": \"Amazon\"," +
" \"price\": 44.99," +
" \"reviews\": [" +
" {" +
" \"reviewer\": \"Cristiano\", " +
" \"review\": \"Excellent book to understand Java Persistence\", " +
" \"date\": \"2017-11-14\", " +
" \"rating\": 5" +
" }," +
" {" +
" \"reviewer\": \"T.W\", " +
" \"review\": \"The best JPA ORM book out there\", " +
" \"date\": \"2019-01-27\", " +
" \"rating\": 5" +
" }," +
" {" +
" \"reviewer\": \"Shaikh\", " +
" \"review\": \"The most informative book\", " +
" \"date\": \"2016-12-24\", " +
" \"rating\": 4" +
" }" +
" ]" +
"}"
)
);
Anda hampir tidak dapat membaca JSON karena karakter yang melarikan diri dan banyaknya tanda kutip ganda dan tanda plus.
Dengan Blok Teks Java, objek JSON dapat ditulis seperti ini:
entityManager.persist(
new Book()
.setId(1L)
.setIsbn("978-9730228236")
.setProperties("""
{
"title": "High-Performance Java Persistence",
"author": "Vlad Mihalcea",
"publisher": "Amazon",
"price": 44.99,
"reviews": [
{
"reviewer": "Cristiano",
"review": "Excellent book to understand Java Persistence",
"date": "2017-11-14",
"rating": 5
},
{
"reviewer": "T.W",
"review": "The best JPA ORM book out there",
"date": "2019-01-27",
"rating": 5
},
{
"reviewer": "Shaikh",
"review": "The most informative book",
"date": "2016-12-24",
"rating": 4
}
]
}
"""
)
);
Sejak saya menggunakan C # pada tahun 2004, saya ingin memiliki fitur ini di Java, dan sekarang akhirnya kita memilikinya.
string1 + string2
Anda mengalokasikan objek string baru dan menyalin karakter dari kedua string input. Jika Anda menambahkan n String bersama-sama Anda akan melakukan alokasi n-1 dan sekitar (n ^ 2) / 2 salinan karakter. StringBuilder, di sisi lain, menyalin dan merealokasi lebih jarang (meskipun masih melakukan keduanya ketika Anda melebihi ukuran buffer internal). Secara teoritis, ada beberapa kasus di mana kompiler dapat mengonversi + untuk menggunakan StringBuilder tetapi dalam praktiknya siapa tahu.