Khối văn bản Java 13 * KHÔNG CÓ * dòng mới


12

Công cụ khối văn bản đa dòng Java 13 với các """dấu phân cách đang trở nên nổi tiếng.

Tuy nhiên tôi có một nhu cầu định kỳ khi tôi cần toàn bộ các đoạn mà không có các dòng mới được nhúng.

Nói cách khác, đoạn mã sau:

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

tạo ra những điều sau đây, như bạn mong đợi:

aaaa bbbb cccc
dddd eeee ffff
gggg hhhh iiii

... thường rất hữu ích. Tuy nhiên, trong trường hợp của tôi, đối với các đoạn đặc biệt lớn, tôi cần nó để tạo ra điều này:

aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii

(.... và xử lý luồng văn bản sau.)

Có cách nào để thiết lập tham số "không có dòng mới" cho tính năng ba trích dẫn không?


Hãy tưởng tượng việc nhập một lượng lớn văn bản là phần sau của tài liệu HTML hoặc tương tự được chuyển vào (giả sử) một hộp thoại có thể thay đổi kích thước. Tôi muốn nhập vào nhiều "dòng" giá trị của dữ liệu mà không cần sự "line" + "line" + "line", vv, và nếu không có sự của EOL hiển thị. Tránh sự khó hiểu và khó duy trì cú pháp như vậy hoàn toàn là vấn đề phía sau """.
alife

Câu trả lời:


16

Các nhà thiết kế của tính năng này cũng nhận ra yêu cầu này (xem 'Trình tự thoát mới' trong JEP368). Vì vậy, với bản dựng truy cập sớm mới nhất cho JDK 14, bạn có thể sử dụng dấu vết \để thoát khỏi dòng mới ở cuối dòng:

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

Bản in:

aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii

14 hả Tôi tự hỏi làm thế nào sự kết hợp của thụt lề sẽ hoạt động, hoặc nếu tất cả các khoảng trắng được xóa sạch?
alife

Nhưng điều đó vẫn sẽ yêu cầu sửa đổi đầu vào chuỗi hiện tại có thể đủ xứng đáng để loại bỏ trực tiếp dòng mới trong trường hợp đó.
Naman

3
Hmm, đầu tiên họ nói là có thể văn bản đen nhúng như nó vốn có là một tính năng quan trọng như vậy mà nó biện minh cho những thay đổi ngôn ngữ, bây giờ nó được trình tự thoát một mình, và tôi phải ngạc nhiên, lợi thế là những gì trên đặt "aaaa bbbb cccc ", +"dddd eeee ffff "+"gggg hhhh iiii ", mỗi trong một dòng riêng biệt
Holger

@Holger Tính năng này đã được chia thành 2; khối văn bản (còn gọi là chuỗi nhiều dòng) và chuỗi ký tự thô (nghĩa là chuỗi as-is, là tbd). Đây chỉ là trước đây. Lưu ý rằng các lối thoát khác, như \n, vẫn hoạt động trong các khối văn bản.
Jorn Vernee

1
Nhưng bây giờ chúng ta có readString, tài nguyên nhúng cũng dễ xử lý hơn nhiều. Tôi không bao giờ muốn tích hợp toàn bộ đoạn văn vào mã nguồn, chỉ có những thứ I / O gây phiền nhiễu.
Holger

4

Bạn có thể sử dụng được String.linesgiới thiệu kể từ Java-11 như:

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

Miễn phí và cho những gì xứng đáng, đây là một ảnh chụp màn hình từ việc thực thi JShell của hai khối mã khác nhau:

nhập mô tả hình ảnh ở đây


3
Sai mà giống nhưString output = paragraph.replaceAll("[\n\r]", "");
Holger

Và không phải là giải pháp (cho đến khi sửa đổi cho phép \strong """khối của JDK-14 ) cho phép tôi xen kẽ các dòng không có EOL với các dòng mà tôi thực sự muốn trả lại khó khăn (chẳng hạn như giữa các đoạn, v.v.)
alife

1

Thật vậy, việc tìm ra một câu trả lời tốt trong Java 13 không dễ dàng (thậm chí là không thể) nhưng tôi nghĩ Jorn Vernee đã giải quyết mối quan tâm một cách duyên dáng trong câu trả lời của anh ấy (các chuỗi thoát mới trong Java 14 cung cấp một giải pháp chấp nhận được).

Để mở rộng trên một số mối quan tâm được liệt kê:

  • Holger đề cập đến "tính năng" khối văn bản "không thuyết phục lắm". Tôi đã thấy rất nhiều mã "xấu" thực hiện nối chuỗi nhân tạo, vì vậy tôi nghĩ rằng tính năng này chắc chắn giải quyết được một vấn đề . Mặt khác, tôi phải đồng ý rằng một tính năng như thế này để lại nhiều chỗ bị lạm dụng (như trong "chúng ta hãy đặt nhiều văn bản vào mã Java vì bây giờ chúng ta có thể làm điều đó một cách độc đáo!" - xem điểm tiếp theo ).
  • Câu hỏi ban đầu đề cập đến "các đoạn văn lớn" khiến tôi khuyên bạn không nên sử dụng tính năng này, mà chỉ đưa nội dung đó vào các tệp tài nguyên.
  • Về sự rõ ràng và các khía cạnh nhất định "không rõ ràng đối với người đọc, vì vậy chúng tôi có một cú pháp với ý nghĩa không rõ ràng". Điều đó là một phần chính xác, và nó cần một số đọc và thử nghiệm trong khi tài liệu có sẵn không phải là quá lớn tại thời điểm này. Tôi tìm thấy điều này: Hướng dẫn lập trình khối văn bản , cung cấp khá nhiều ví dụ. Tôi cũng là tác giả của một số ví dụ, một ví dụ về các khối văn bản đang ở đây: TextBlocks.java - hy vọng những điều đó sẽ giúp ích.

Lưu ý cho người điều hành: Tôi biết rằng câu trả lời này có khả năng vi phạm nguyên tắc (Tôi không giải quyết câu hỏi và tôi trả lời nhận xét của người dùng khác), nhưng tôi nghĩ nên có chỗ để tranh luận về các chủ đề vẫn đang hoạt động. (đừng quên rằng các khối văn bản ở chế độ 'xem trước thứ hai' ).


0

paragraph.replaceAll("\\n","") nên làm việc cho bạn


Intellij hiện đang ở trong một số loại vòng lặp do tôi sử dụng các ký tự thoát ở cuối dòng. Có lẽ điều tốt nhất là """ line line line """.replaceAll("\\n",""); không thể xác minh nó ngay bây giờ.
alife

Tôi cho rằng cũng có vấn đề (nhỏ) rằng vấn đề này được xử lý trong thời gian chạy và không phải là thời gian biên dịch, nhưng đó không phải là một yêu cầu cho mục đích của tôi.
alife

Giải pháp này cũng không thể đạt được \skhả năng của JDK-14. Điều gì sẽ xảy ra nếu tôi muốn một vài đoạn không có ngắt dòng, nhưng ngắt dòng ở giữa chúng.
alife
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.