Java 是否有类似于sl4fj的通用字符串替换函数?

Java 是否有类似于sl4fj的通用字符串替换函数?,java,Java,对于sl4fj,如果我想构造字符串消息,有一种很好的方法可以使用替换。例如,它可能类似于: logger.info("Action {} occured on object {}.", objectA.getAction(), objectB); logger.info("Action {} occured on object {} with outcome {}.", new Object[]{objectA.getAction(), objectB, outcome}); St

对于sl4fj,如果我想构造字符串消息,有一种很好的方法可以使用替换。例如,它可能类似于:

logger.info("Action {} occured on object {}.", objectA.getAction(), objectB);
logger.info("Action {} occured on object {} with outcome {}.", 
    new Object[]{objectA.getAction(), objectB, outcome});
String str = someMethod("Action {} occured on object {}.", objectA.getAction(), objectB);
如果需要多个替换,则类似于:

logger.info("Action {} occured on object {}.", objectA.getAction(), objectB);
logger.info("Action {} occured on object {} with outcome {}.", 
    new Object[]{objectA.getAction(), objectB, outcome});
String str = someMethod("Action {} occured on object {}.", objectA.getAction(), objectB);
我的问题是:是否有一种通用的方法来创建字符串(而不仅仅是slf4j日志消息)?比如:

logger.info("Action {} occured on object {}.", objectA.getAction(), objectB);
logger.info("Action {} occured on object {} with outcome {}.", 
    new Object[]{objectA.getAction(), objectB, outcome});
String str = someMethod("Action {} occured on object {}.", objectA.getAction(), objectB);

如果它在标准Java库中,那么“someMethod”是什么?

您可以使用或

例如:

MessageFormat.format("A sample value {1} with a sample string {0}", 
    new Object[] {"first", 1});
或者干脆

MessageFormat.format("A sample value {1} with a sample string {0}", "first", 1);

您还可以使用数字位置,例如切换参数:

String str = String.format("Action %2$s occured on object %1$s.",
   objectA.getAction(), objectB);

如果您正在寻找一种可以用值替换字符串中的一组变量的解决方案,那么可以使用

Map valuesMap=newhashmap();
价值Map.put(“动物”、“快速棕色狐狸”);
价值映射放置(“目标”、“懒狗”);
String templateString=“该${animal}跳过了${target}。”;
StrSubstitutor sub=新的StrSubstitutor(值MAP);
String resolvedString=sub.replace(templateString);
它遵循一种普遍接受的模式,即可以将带有变量的映射与未解析字符串一起传递给值,然后返回一个解析字符串。

我建议使用。借助它,您可以创建一个实用方法,该方法使用与slf4j完全相同的格式样式:

// utillity method to format like slf4j
public static String format(String msg, Object... objs) {
    return MessageFormatter.arrayFormat(msg, objs).getMessage();
}

// example usage
public static void main(String[] args) {
    String msg = format("This msg is {} like slf{}j would do. {}", "formatted", 4,
            new Exception("Not substituted into the message"));

    // prints "This msg is formatted like slf4j would do. {}"    
    System.out.println(msg); 
}
注意:如果数组中的最后一个对象是异常,则不会在消息中替换它,就像使用slf4j记录器一样。可以通过
MessageFormatter.arrayFormat(msg,objs).getThrowable()
访问异常。我选择包装Joern Huxhorn最初为Lilith编写的Log4j2:

public static String format(final String messagePattern, Object... arguments) {
    return ParameterizedMessage.format(messagePattern, arguments);
}
与SLF4J不同,SLF4J侧重于消息格式,后者包含不必要的可丢弃处理

请参阅Javadoc:

处理由包含{}的格式字符串(表示每个可替换令牌)和参数组成的消息


感谢下面有答案的人。另外,我发现这里已经有人问过这个问题:。很抱歉发布了或多或少的副本。这是否回答了您的问题?MessageFormat用途广泛且功能强大,但对于简单的替换,String.format可能更简单且限制更少(例如,MessageFormat要求单引号加倍)。将新整数(1)替换为上面的1也可以。我认为这不是一个好的通用答案,但事实上,我发现这正是正确的答案。就性能而言,这应该是最好的。最好的答案,因为它使用了问题要求的确切语法。坦白说,这是唯一一个与原始问题匹配的答案。。。我不明白为什么现在排名第四。。。