Java 13 Text Block * TANPA * baris baru

12

Fasilitas Java 13 multi-line text block dengan """ pembatas menjadi terkenal.

Namun saya memiliki kebutuhan berulang di mana saya membutuhkan seluruh paragraf tanpa baris baru yang disematkan.

Dengan kata lain, cuplikan kode berikut:

String paragraph =
    """
    aaaa bbbb cccc
    dddd eeee ffff
    gggg hhhh iiii
    """"
System.out.println(paragraph);

menghasilkan yang berikut, seperti yang Anda harapkan:

aaaa bbbb cccc
dddd eeee ffff
gggg hhhh iiii

... yang biasanya sangat berguna. Namun dalam kasus saya, untuk paragraf yang sangat besar saya membutuhkannya untuk menghasilkan ini:

aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii

(.... dan urus alur teks nanti.)

Apakah ada cara untuk membuat parameter "no-newline" untuk fitur triple-quote?

kehidupan
sumber
Bayangkan dengan memasukkan sejumlah besar teks yang nantinya akan menjadi bagian dari dokumen HTML, atau dengan cara serupa mengalir ke (katakanlah) kotak dialog yang dapat diubah ukurannya. Saya ingin masuk dalam banyak "garis" senilai data tanpa itu "line" + "line" + "line", dll, dan tanpa EOL ini muncul. Menghindari sintasan dan kesulitan mempertahankan sintaksis sepenuhnya merupakan titik di belakang """.
alife

Jawaban:

16

Para perancang fitur ini juga menyadari persyaratan ini (lihat 'Urutan pelarian baru' di JEP368). Jadi, dengan build akses awal terbaru untuk JDK 14 Anda dapat menggunakan trailing \untuk keluar dari baris baru di akhir baris:

public class Main {
    public static void main(String[] args) {
        String paragraph =
            """
            aaaa bbbb cccc \
            dddd eeee ffff \
            gggg hhhh iiii \
            """;
        System.out.println(paragraph);
    }
}

Cetakan:

aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii
Jorn Vernee
sumber
14, ya? Saya bertanya-tanya bagaimana rangkaian indentasi akan bekerja, atau jika semua ruang putih dihapus bersih?
alife
Tapi itu masih akan membutuhkan memodifikasi input string yang ada yang mungkin cukup layak untuk langsung menghapus baris baru itu sendiri dalam kasus itu.
Naman
3
Hmm, pertama mereka mengatakan mampu menanamkan teks literal seperti apa yang seperti fitur penting yang membenarkan perubahan bahasa, sekarang mendapat escape sequence pada mereka sendiri, dan saya harus bertanya-tanya, apa keuntungan lebih menempatkan "aaaa bbbb cccc ", +"dddd eeee ffff "dan +"gggg hhhh iiii ", masing-masing dalam garis yang berbeda ...
Holger
@ Holger Fitur ini telah dibagi menjadi 2; blok teks (alias string multi-baris), dan literal string mentah (yaitu string as-is, yang merupakan tbd). Ini hanya yang pertama. Perhatikan bahwa lolos lainnya, seperti \n, masih berfungsi di blok teks.
Jorn Vernee
1
Tetapi sekarang readString, sumber daya yang tertanam jauh lebih mudah untuk ditangani. Saya tidak pernah ingin mengintegrasikan seluruh paragraf ke dalam kode sumber, hanya hal-hal I / O yang mengganggu.
Holger
4

Anda dapat menggunakan String.linesdiperkenalkan sejak Java-11 sebagai:

String output = paragraph.lines().collect(Collectors.joining());

Gratis dan apa pun yang sepadan, berikut adalah cuplikan layar dari eksekusi JShell dari dua blok kode yang berbeda:

masukkan deskripsi gambar di sini

Naman
sumber
3
... yang melakukan hal yang sama denganString output = paragraph.replaceAll("[\n\r]", "");
Holger
Dan bukan solusi (sampai modifikasi JDK-14 yang memungkinkan \sdi """blok) memungkinkan saya untuk mencampurkan garis-garis EOL-kurang dengan garis-garis di mana saya benar-benar ingin pengembalian yang keras (seperti antara paragraf, dll.)
alife
1

Memang, menemukan jawaban yang baik di Java 13 tidak mudah (mungkin bahkan tidak mungkin) tapi saya pikir Jorn Vernee menjawab kekhawatiran itu dengan anggun dalam jawabannya (urutan pelarian baru di Jawa 14 memberikan solusi yang dapat diterima).

Untuk memperluas beberapa kekhawatiran yang terdaftar:

  • Holger menyebutkan "fitur 'blok teks' tidak terlalu meyakinkan". Saya telah melihat banyak kode "jelek" yang melakukan penggabungan string buatan, jadi saya pikir fitur pasti mengatasi masalah . Di sisi lain, saya harus setuju bahwa fitur seperti ini menyisakan banyak ruang untuk penyalahgunaan (seperti dalam "mari kita meletakkan banyak teks dalam kode Java karena sekarang kita bisa melakukannya dengan baik!" - lihat poin berikutnya ).
  • Pertanyaan aslinya menyebutkan "paragraf besar" yang membuat saya saran untuk tidak menggunakan fitur ini sama sekali, tetapi mengeksternalisasi konten itu ke file sumber daya.
  • Tentang kejelasan dan bahwa aspek-aspek tertentu "tidak jelas bagi pembaca, jadi kami memiliki sintaks dengan makna yang tidak jelas". Itu sebagian benar, dan butuh beberapa bacaan dan eksperimen sementara bahan yang tersedia tidak begitu luas saat ini. Saya menemukan ini: Panduan Programmer Untuk Blok Teks , yang menyediakan cukup banyak contoh. Saya juga menulis beberapa contoh, yang ada di blok teks ada di sini: TextBlocks.java - mudah-mudahan itu akan membantu.

Catatan untuk moderator: Saya tahu bahwa jawaban ini berpotensi melanggar pedoman (saya tidak menjawab pertanyaan dan saya membalas komentar pengguna lain), tapi saya pikir harus ada ruang untuk debat untuk topik yang masih dalam proses (jangan lupa bahwa blok teks dalam mode 'pratinjau kedua' ).

Chris T
sumber
0

paragraph.replaceAll("\\n","") harus melakukan pekerjaan untuk Anda.

Guillaume
sumber
Intellij sekarang berada dalam semacam tabrakan karena saya menggunakan karakter pelarian di akhir baris. Mungkin yang terbaik adalah """ line line line """.replaceAll("\\n",""); tidak bisa memverifikasinya sekarang.
alife
Saya kira ada juga masalah (kecil) yang ditangani saat runtime dan bukan waktu kompilasi, tapi itu bukan persyaratan untuk tujuan saya.
alife
Solusi ini juga tidak bisa mencapai \skemampuan JDK-14. Bagaimana jika saya ingin beberapa paragraf tanpa jeda baris, tetapi jeda baris di antara mereka.
alife