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

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

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

person Dennis Gloss    schedule 25.04.2020    source источник
comment
В конце концов, это представление String. По крайней мере, на данный момент без дополнительных подробностей о том, почему бы не попробовать использовать существующую конструкцию, такую ​​​​как String.format , вопрос будет стоять как точная копия. Оставим остальное на усмотрение сообщества.   -  person Naman    schedule 26.04.2020
comment
Отвечает ли это на ваш вопрос Java — включение переменных в строки?   -  person Naman    schedule 26.04.2020
comment
Я больше думал о том, как написать java-код внутри текстового блока, String.format больше похоже на обходной путь, который, к сожалению, я не придумал...   -  person Dennis Gloss    schedule 26.04.2020
comment
@DennisGlot String::format не является обходным решением, это обычный способ интерполяции строк в Java. (С текстовыми блоками также была добавлена ​​версия экземпляра, поэтому вы можете сказать "...".formatted(...), если предпочитаете цепочку.)   -  person Brian Goetz    schedule 26.04.2020
comment
Отвечает ли это на ваш вопрос? Как добавить переменные в текстовый блок Java 15 функция?   -  person Alex Shesterov    schedule 07.09.2020
comment
@alex-shesterov в основном, этот вопрос дублирует мой   -  person Dennis Gloss    schedule 08.09.2020


Ответы (1)


Вы можете использовать %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 docs String.formatted​ устарел и рекомендуется использовать String .format(это, аргументы).

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

person Deadpool    schedule 25.04.2020
comment
Не могли бы вы объяснить, почему это не дубликат stackoverflow. com/questions/9643610/? - person Naman; 26.04.2020
comment
@Naman Потому что этот вопрос касается обычного синтаксиса строк, а этот вопрос конкретно касается текстовых блоков. - person Basil Bourque; 26.04.2020
comment
@BasilBourque JEP-355 гласит: Определение нового ссылочный тип, отличный от java.lang.String, для строк, выраженных любой новой конструкцией. или наоборот, текстовый блок представляет собой многострочную строку литерал, который устраняет необходимость в большинстве escape-последовательностей, автоматически форматирует строку предсказуемым образом и дает разработчику контроль над форматом, когда это необходимо '. (отформатировано мной). Как бы то ни было, оставление решения на усмотрение сообщества из-за конфликта мнений добавило к отсутствию интереса к JEP. - person Naman; 26.04.2020
comment
String.formatted на самом деле не устарел. Фактически это новый метод (начиная с Java 13). Он устарел только потому, что связан с текстовыми блоками, которые являются функцией предварительного просмотра. Но если вы используете текстовые блоки, вы также можете использовать этот метод. - person user140547; 26.04.2020
comment
docs.oracle.com/en/java/javase/15/docs/api/java.base/java/lang/ теперь безопасно использовать его - person lpandzic; 22.09.2020