Java 13 Text Block * โดยไม่ต้องขึ้นบรรทัดใหม่


12

สิ่งอำนวยความสะดวกบล็อกข้อความแบบหลายบรรทัด Java 13 พร้อม"""ตัวคั่นกำลังเป็นที่รู้จักกันดี

อย่างไรก็ตามฉันมีความต้องการที่เกิดซ้ำที่ฉันต้องการทั้งย่อหน้าโดยไม่ต้องขึ้นบรรทัดใหม่

ในคำอื่น ๆ รหัสต่อไปนี้:

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

สร้างสิ่งต่อไปนี้ตามที่คุณคาดหวัง:

aaaa bbbb cccc
dddd eeee ffff
gggg hhhh iiii

... ซึ่งมักเป็นประโยชน์อย่างมาก อย่างไรก็ตามในกรณีของฉันสำหรับย่อหน้าที่มีขนาดใหญ่โดยเฉพาะฉันต้องการมันในการผลิต:

aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii

(.... และจัดการกับการไหลของข้อความในภายหลัง)

มีวิธีในการสร้างพารามิเตอร์ "ไม่ขึ้นบรรทัดใหม่" สำหรับคุณลักษณะการอ้างอิงสามทางหรือไม่?


ลองนึกภาพการป้อนข้อความจำนวนมากที่จะเป็นส่วนหนึ่งของเอกสาร HTML ในภายหลังหรือไหลลงในกล่องโต้ตอบที่ปรับขนาดได้เช่นเดียวกัน ฉันต้องการที่จะใส่ใน "เส้น" หลายคนมูลค่าของข้อมูลโดยไม่ต้อง"line" + "line" + "line"ฯลฯ และโดยไม่ต้อง EOL ของการแสดงขึ้น การหลีกเลี่ยงการป้านและยากที่จะรักษาไวยากรณ์ดังกล่าวเป็นจุดที่อยู่เบื้องหลัง"""ทั้งหมด
alife

คำตอบ:


16

ผู้ออกแบบคุณสมบัตินี้รับรู้ถึงข้อกำหนดนี้เช่นกัน (ดู'New escape sequences'ใน JEP368) ดังนั้นด้วยโครงสร้างการเข้าถึงก่อนหน้าล่าสุดสำหรับJDK 14คุณสามารถใช้การต่อท้าย\เพื่อหลบเลี่ยงบรรทัดใหม่ที่ท้ายบรรทัด:

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

พิมพ์:

aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii

14 ใช่มั้ย ฉันสงสัยว่าการเยื้องของการเยื้องจะทำงานอย่างไรหรือถ้าพื้นที่สีขาวทั้งหมดถูกเช็ด
alife

แต่นั่นก็ยังคงต้องการการแก้ไขอินพุตสตริงที่มีอยู่ซึ่งอาจมีค่าพอที่จะลบบรรทัดใหม่ได้โดยตรงในกรณีนั้น
Naman

3
อืมแรกที่พวกเขากล่าวว่าความสามารถในการข้อความตัวอักษรฝังตามที่เป็นเป็นเช่นคุณลักษณะที่สำคัญว่ามัน justifies การเปลี่ยนแปลงภาษาตอนนี้มันได้รับลำดับหนีของตัวเองและฉันต้องสงสัยว่ามีอะไรเปรียบที่เหนือกว่าการวาง"aaaa bbbb cccc ", +"dddd eeee ffff "และ+"gggg hhhh iiii "แต่ละ ในบรรทัดที่แตกต่าง ...
Holger

@Holger คุณลักษณะนี้ถูกแบ่งออกเป็น 2; บล็อคข้อความ (อาคาสตริงหลายเส้น) และตัวอักษรสตริงดิบ (เช่นตามที่เป็นสตริงซึ่งเป็น tbd) นี่เป็นเพียงอดีต โปรดทราบว่าการหลีกเลี่ยงอื่น ๆ เช่น\nยังคงทำงานในบล็อกข้อความ
Jorn Vernee

1
แต่ตอนนี้เรามีreadStringทรัพยากรที่ฝังอยู่ก็จัดการได้ง่ายกว่าเช่นกัน ฉันไม่เคยต้องการรวมย่อหน้าทั้งหมดไว้ในซอร์สโค้ดมีเพียงสิ่ง I / O เท่านั้นที่น่ารำคาญ
Holger

4

คุณสามารถใช้การString.linesแนะนำตั้งแต่ Java-11 เป็น:

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

ฟรีและสำหรับสิ่งที่คุ้มค่านี่คือภาพหน้าจอจากการเรียกใช้ JShell ของโค้ดสองบล็อกที่แตกต่างกัน:

ป้อนคำอธิบายรูปภาพที่นี่


3
…ซึ่งทำเช่นเดียวกับString output = paragraph.replaceAll("[\n\r]", "");
โฮล

และไม่ใช่วิธีแก้ปัญหา (จนกระทั่งการปรับเปลี่ยนการอนุญาต\sใน"""บล็อกของJDK-14 ) อนุญาตให้ฉัน
alife

1

แน่นอนการหาคำตอบที่ดีใน Java 13 นั้นไม่ใช่เรื่องง่าย (อาจเป็นไปไม่ได้) แต่ฉันคิดว่า Jorn Vernee พูดถึงข้อกังวลอย่างสง่างามในคำตอบของเขา (ลำดับการหลบหนีใหม่ใน Java 14 เป็นวิธีแก้ปัญหาที่ยอมรับได้)

หากต้องการขยายความกังวลตามที่ระบุไว้หลายประการ:

  • Holger กล่าวถึง "คุณสมบัติ" บล็อคข้อความ "ไม่น่าเชื่อมากนัก" ฉันได้เห็นมากรหัส "น่าเกลียด" ที่ไม่ concatenation สตริงเทียมดังนั้นฉันคิดว่าคุณลักษณะแน่นอนเน้นปัญหา ในอีกด้านหนึ่งฉันต้องยอมรับว่าคุณลักษณะเช่นนี้ทำให้มีพื้นที่เหลือสำหรับการละเมิด (เช่น "ให้เราใส่ข้อความจำนวนมากในโค้ด Java เพราะตอนนี้เราทำได้ดีมาก!" - ดูประเด็นต่อไป )
  • คำถามเดิมกล่าวถึง "ย่อหน้าใหญ่" ซึ่งทำให้ฉันไม่แนะนำให้ใช้คุณลักษณะนี้เลย แต่เป็นการส่งเนื้อหานั้นไปยังไฟล์ทรัพยากร
  • เกี่ยวกับความชัดเจนและบางแง่มุม "ไม่ชัดเจนต่อผู้อ่านดังนั้นเราจึงมีไวยากรณ์ที่มีความหมายไม่ชัดเจน" มันถูกต้องบางส่วนและต้องใช้เวลาในการอ่านและทดลองในขณะที่วัสดุที่มีอยู่นั้นไม่ได้กว้างใหญ่ในขณะนี้ ฉันพบสิ่งนี้: Programmer's Guide To Text Blocksซึ่งมีตัวอย่างมากมาย ฉันยังเขียนตัวอย่างบางส่วนหนึ่งในบล็อกข้อความอยู่ที่นี่: TextBlocks.java - หวังว่าผู้ที่จะช่วย

หมายเหตุสำหรับผู้ดำเนินรายการ: ฉันรู้ว่าคำตอบนี้อาจละเมิดหลักเกณฑ์ (ฉันไม่ได้ตอบคำถามและฉันตอบความคิดเห็นของผู้ใช้คนอื่น) แต่ฉันคิดว่าควรมีพื้นที่สำหรับการอภิปรายสำหรับหัวข้อที่ยังคงทำงานอยู่ (อย่าลืมว่าบล็อคข้อความอยู่ในโหมด 'ดูตัวอย่างที่สอง' )


0

paragraph.replaceAll("\\n","") ควรทำงานให้คุณ


Intellij ตอนนี้อยู่ในรูปแบบของการวนรอบการหยุดทำงานบางอย่างเนื่องจากฉันใช้ตัวละครการหลบหนีในตอนท้ายของบรรทัด บางทีสิ่งที่ดีที่สุดก็คือ""" line line line """.replaceAll("\\n",""); ตอนนี้ไม่สามารถตรวจสอบได้
alife

ฉันคิดว่ายังมีปัญหา (เล็กน้อย) ที่จัดการในขณะใช้งานจริงและไม่ได้รวบรวมเวลา แต่นั่นไม่ใช่ข้อกำหนดสำหรับวัตถุประสงค์ของฉัน
alife

โซลูชันนี้ยังไม่สามารถเข้าถึง\sความสามารถของ JDK-14 ได้ ถ้าฉันต้องการย่อหน้าหลายย่อหน้าที่ไม่มีตัวแบ่งบรรทัด แต่ตัวแบ่งบรรทัดอยู่ระหว่างกัน
alife
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.