Как иметь заполнитель для значения переменной в текстовом блоке Java

Как я могу поместить переменную в текстовый блок Ja va?
подобно

"""
{
  ...
  "someKey": "someValue",
  "date": "${LocalDate.now()}",
  ...
}
"""

3 ответа

Решение

Вы можете использовать %s как заполнитель в текстовых блоках

String str = """
{
...
"someKey": "someValue",
"date": %s,
...
}
"""

и замените его, используя формат

String.format(str,LocalDate.now());

От jeps 355 документов

Более чистая альтернатива - использовать String::replace или String::format, как показано ниже:

String code = """
          public void print($type o) {
              System.out.println(Objects.toString(o));
          }
          """.replace("$type", type);

String code = String.format("""
          public void print(%s o) {
              System.out.println(Objects.toString(o));
          }
          """, type);

Другая альтернатива включает введение нового метода экземпляра String::formatted, который можно использовать следующим образом:

String source = """
            public void print(%s object) {
                System.out.println(Objects.toString(object));
            }
            """.formatted(type);

Примечание: Но, как примечание стороны от Java-13 DocsString.formatted​устарел и предлагается использовать String.format(this, args).

Этот метод связан с текстовыми блоками, функцией языка предварительного просмотра. Текстовые блоки и / или этот метод могут быть изменены или удалены в будущем выпуске.

Вы можете использовать функцию строковых шаблонов Java. Он описан в JEP 430 и появляется в JDK 21 как функция предварительного просмотра. Вот пример использования:

      String name = "Joan";
String info = STR."My name is \{name}";
assert info.equals("My name is Joan");   // true

Он также поддерживает многострочные текстовые блоки Java:

      String title = "My Web Page";
String text  = "Hello, world";
String html = STR."""
        <html>
          <head>
            <title>\{title}</title>
          </head>
          <body>
            <p>\{text}</p>
          </body>
        </html>
        """;

Строковые шаблоны Java более универсальны и намного безопаснее, чем функции других языков, такие как строковая интерполяция C# и f-строки Python. Например, вот процессор шаблонов, который возвращает не строки, а экземпляры JSONObject:

      var JSON = StringTemplate.Processor.of(
        (StringTemplate st) -> new JSONObject(st.interpolate())
    );

String name    = "Joan Smith";
String phone   = "555-123-4567";
String address = "1 Maple Drive, Anytown";
JSONObject doc = JSON."""
    {
        "name":    "\{name}",
        "phone":   "\{phone}",
        "address": "\{address}"
    };
    """;

Вы можете использовать функцию строковых шаблонов Java. Он описан в JEP 430 и появляется в JDK 21 как функция предварительного просмотра. Вот пример однострочного использования:

      String name = "Joan";
String info = STR."My name is \{name}";
assert info.equals("My name is Joan");   // true

Он также поддерживает многострочные текстовые блоки Java:

      String title = "My Web Page";
String text  = "Hello, world";
String html = STR."""
        <html>
          <head>
            <title>\{title}</title>
          </head>
          <body>
            <p>\{text}</p>
          </body>
        </html>
        """;

Строковые шаблоны Java более универсальны и намного безопаснее, чем функции других языков, такие как строковая интерполяция C# и f-строки Python. Например, конкатенация или интерполяция строк делает возможными атаки SQL-инъекцией:

      String query = "SELECT * FROM Person p WHERE p.last_name = '" + name + "'";
ResultSet rs = conn.createStatement().executeQuery(query);

но этот вариант (из JEP 430) предотвращает внедрение SQL:

      PreparedStatement ps = DB."SELECT * FROM Person p WHERE p.last_name = \{name}";
ResultSet rs = ps.executeQuery();

и вы можете сделать что-то подобное, чтобы создать структуру данных HTML с помощью шаблона строки, заключающей в кавычки объекты HTML.

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