Строковая интерполяция в 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;
    }

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