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

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 ответ

Решение

Сделаем Stringкороче.

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. недопустимая последовательность открытого разделителя текстового блока, отсутствующий терминатор строки

Другие вопросы по тегам