Как иметь заполнитель для значения переменной в текстовом блоке Java
Как я могу поместить переменную в текстовый блок Ja va?
подобно
"""
{
...
"someKey": "someValue",
"date": "${LocalDate.now()}",
...
}
"""
3 ответа
Вы можете использовать %s
как заполнитель в текстовых блоках
String str = """
{
...
"someKey": "someValue",
"date": %s,
...
}
"""
и замените его, используя формат
String.format(str,LocalDate.now());
Более чистая альтернатива - использовать 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.