Строковая интерполяция в Java 14 или 15
Поскольку я использую функции предварительного просмотра Java 14 и 15. Пытаемся найти строковую интерполяцию в java.
Самый близкий ответ, который я нашел, это
String.format("u1=%s;u2=%s;u3=%s;u4=%s;", u1, u2, u3, u4)
Поскольку ответ, который я получил из множества ссылок, - это старые ответы, заданные 4,5 года назад. Есть ли обновление для интерполяции строк в java 11,12,13,14,15, эквивалентное С #
string name = "Horace";
int age = 34;
Console.WriteLine($"Your name is {name} and your age {age}");
6 ответов
Насколько мне известно, в стандартных java-библиотеках нет обновлений, касающихся такого форматирования строк.
Другими словами: вы все еще "застряли" в одном из вариантов String.format()
и его механизм подстановки на основе индекса, или вам нужно выбрать стороннюю библиотеку / фреймворк, например Velocity, FreeMarker, ... см. здесь для первоначального обзора.
Существует что - то немного ближе; экземплярная версияString::format
, называется formatted
:
String message = "Hi, %s".formatted(name);
Это похоже на String::format
, но его удобнее использовать в связанных выражениях.
В настоящее время это не встроенная поддержка, но Apache Commons StringSubstitutor
может быть использован.
import org.apache.commons.text.StringSubstitutor;
// ...
Map<String, String> values = new HashMap<>();
values.put("animal", "quick brown fox");
values.put("target", "lazy dog");
StringSubstitutor sub = new StringSubstitutor(values);
String result = sub.replace("The ${animal} jumped over the ${target}.");
// "The quick brown fox jumped over the lazy dog."
Этот класс поддерживает предоставление значений по умолчанию для переменных.
String result = sub.replace("The number is ${undefined.property:-42}.");
// "The number is 42."
Чтобы использовать рекурсивную замену переменной, вызовите
setEnableSubstitutionInVariables(true);
.
Map<String, String> values = new HashMap<>();
values.put("b", "c");
values.put("ac", "Test");
StringSubstitutor sub = new StringSubstitutor(values);
sub.setEnableSubstitutionInVariables(true);
String result = sub.replace("${a${b}}");
// "Test"
Вы можете использовать функцию строковых шаблонов Java. Он описан в JEP 430 и появляется в JDK 21 как функция предварительного просмотра. Вот пример использования:
string name = "Horace";
int age = 34;
System.out.println(STR."Your name is {name} and your age {age}");
Вы также можете использовать MessageFormat следующим образом (Java 5.0 или более поздняя версия)
MessageFormat.format("Hello {0}, how are you. Goodbye {0}",userName);
Очень хорошо
Похоже, хорошая интерполяция C# вообще не работает в этой версии java. Зачем нам это нужно - чтобы иметь красивые и читаемые строки кода, выгружающие текст в файлы журнала. Ниже приведен пример кода, который работает (есть комментарий org.apache.commons.lang3.StringUtils, который в какой-то момент был необходим, но позже этого не было) - он отбрасывал ClassNotFound или другое NotFoundException - я не исследовал его.
StringSubstitutor может быть позже упакован во что-то более приятное, что упростит использование для дампа сообщений журнала.
package main;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.text.*;
//import org.apache.commons.lang3.StringUtils;
public class Main {
public static void main(String[] args) {
System.out.println("Starting program");
var result = adding(1.35,2.99);
Map<String, String> values = new HashMap<>();
values.put("logMessageString", Double.toString(result) );
StringSubstitutor sub = new StringSubstitutor(values);
sub.setEnableSubstitutionInVariables(true);
String logMessage = sub.replace("LOG result of adding: ${logMessageString}");
System.out.println(logMessage);
System.out.println("Ending program");
}
// it can do many other things but here it is just for prcoessing two variables
private static double adding(double a, double b) {
return a+b;
}
}