Функция предварительного просмотра JDK 13: Textblock возвращает false для равных и ==. Зависит ли пространство табуляции? - PullRequest
0 голосов
/ 26 сентября 2019

equals и == возвращают false для строки текстового блока, хотя они печатают то же самое в консоли.

public class Example {
    public static void main(String[] args) {
        String jsonLiteral = ""
                + "{\n"
                + "\tgreeting: \"Hello\",\n"
                + "\taudience: \"World\",\n"
                + "\tpunctuation: \"!\"\n"
                + "}\n";

        String jsonBlock = """
                {
                    greeting: "Hello",
                    audience: "World",
                    punctuation: "!"
                }
                """;

        System.out.println(jsonLiteral.equals(jsonBlock)); //false
        System.out.println(jsonBlock == jsonLiteral);
    }
}

Что мне не хватает?

1 Ответ

1 голос
/ 27 сентября 2019

Давайте сделаем String s короче.

String jsonLiteral = ""
        + "{\n"
        + "\tgreeting: \"Hello\"\n"
        + "}\n";

String jsonBlock = """
        {
            greeting: "Hello"
        }
        """;

Давайте отладим их и напечатаем их фактическое содержимое.

"{\n\tgreeting: \"Hello\"\n}\n"
"{\n    greeting: \"Hello\"\n}\n"

\t и " " (четыре ASCII SPсимволы или четыре пробела) не равны, равно как и целые String с.Как вы, возможно, заметили, отступ в текстовом блоке был образован пробелами (а не горизонтальными табуляциями, или фидами форм, или любыми другими символами, похожими на пробелы).

Вот несколько примеров текстовых блоков из спецификация для JEP 355 :

String season = """
                winter""";    // the six characters w i n t e r

String period = """
                winter
                """;          // the seven characters w i n t e r LF

String greeting = 
    """
    Hi, "Bob"
    """;        // the ten characters H i , SP " B o b " LF

String salutation =
    """
    Hi,
     "Bob"
    """;        // the eleven characters H i , LF SP " B o b " LF

String empty = """
               """;      // the empty string (zero length)

String quote = """
               "
               """;      // the two characters " LF

String backslash = """
                   \\
                   """;  // the two characters \ LF

В вашем случае

String jsonBlock = """
          {
              greeting: "Hello"
          }
          """; // the 26 characters { LF SP SP SP SP g r e e t i n g : SP " H e l l o " LF } LF

Чтобы сделать их равными,замените "\t" на " "equals, и == должны возвращать true, хотя вы не должны полагаться на последнее.


Чтобы прочитать:

  1. Спецификация для JEP 355: текстовые блоки (предварительный просмотр)

Похожие:

  1. Какнамерения, обработанные в текстовом блоке (Java 13)

  2. недопустимая последовательность открытого разделителя текстового блока, терминатор отсутствующей строки

...