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中是否有任何等效于C#的字符串插值更新

string name = "Horace";
int age = 34;
Console.WriteLine($"Your name is {name} and your age {age}");

解决方法

有些距离稍近String::format的实例版本,称为formatted

String message = "Hi,%s".formatted(name);

它与String::format类似,但是在链接表达式中使用更友好。

,

据我所知,标准的Java库中没有关于此类字符串格式的更新。

换句话说:您仍然无法使用String.format()及其基于索引的替换机制,或者您必须选择一些第三方库/框架,例如Velocity,FreeMarker等。 here进行初步概述。

,

目前没有内置支持,但可以使用 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"
,

看起来不错的 C# 插值 si 在这些 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;
    }

}