是否有一个类似于sl4fj的通用stringreplace函数?
用sl4fj如果我想要构造一个string消息有一个很好的方法,利用替代。 例如,它可能是这样的:
logger.info("Action {} occured on object {}.", objectA.getAction(), objectB);
如果有多个replace需要,那么它是这样的:
logger.info("Action {} occured on object {} with outcome {}.", new Object[]{objectA.getAction(), objectB, outcome});
我的问题是:是否有一个通用的方式来创build一个string(而不仅仅是一个slf4j日志消息)? 就像是:
String str = someMethod("Action {} occured on object {}.", objectA.getAction(), objectB);
要么
String str = someMethod("Action {} occured on object {} with outcome {}.", new Object[]{objectA.getAction(), objectB, outcome});
如果它在标准Java库中,那么“someMethod”是什么?
谢谢。
的String.format
String str = String.format("Action %s occured on object %s.", objectA.getAction(), objectB);
要么
String str = String.format("Action %s occured on object %s with outcome %s.", new Object[]{objectA.getAction(), objectB, outcome});
您也可以使用数字位置来切换参数。
String str = String.format("Action %2$s occured on object %1$s.", objectA.getAction(), objectB);
您可以使用String.format或MessageFormat.format
例如,
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);
如果您正在寻找一种解决scheme,您可以使用StrSubstitutorreplaceString中的一堆variables。
Map<String, String> valuesMap = new HashMap<>(); valuesMap.put("animal", "quick brown fox"); valuesMap.put("target", "lazy dog"); String templateString = "The ${animal} jumped over the ${target}."; StrSubstitutor sub = new StrSubstitutor(valuesMap); String resolvedString = sub.replace(templateString);
它遵循一个普遍接受的模式,在这个模式中,可以将带有variables的映射与未parsing的string一起传递给值,并返回已parsing的string。
我会build议使用org.slf4j.helpers.MessageFormatter 。 在它的帮助下,可以创build一个使用与slf4j完全相同的格式化风格的utillity方法:
// 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); }
注意 :如果数组中的最后一个对象是一个exception,它将不会在消息中被replace,就像使用slf4jlogging器一样。 exception可以通过MessageFormatter.arrayFormat(msg, objs).getThrowable()
来访问。