在Java中有更优雅的方法吗?
String value1 = "Testing";
String test = "text goes here " + value1 + " more text";
是否可以将变量直接放在字符串中并评估其值?
答案 0 :(得分:53)
String test = String.format("test goes here %s more text", "Testing");
是您可以用Java编写的最接近的东西
答案 1 :(得分:26)
更优雅的方式可能是:
String value = "Testing";
String template = "text goes here %s more text";
String result = String.format(template, value);
或者使用MessageFormat:
String template = "text goes here {0} more text";
String result = MessageFormat.format(template, value);
注意,如果您正在执行此操作以进行日志记录,则可以避免在日志行低于阈值时执行此操作的成本。例如SLFJ:
以下两行将产生完全相同的输出。但是,如果禁用日志记录,第二种形式的性能将比第一种形式的性能提高至少30倍。
logger.debug("The new entry is "+entry+".");
logger.debug("The new entry is {}.", entry);
答案 2 :(得分:3)
Rythm现在发布了一个名为 String interpolation mode 的新功能的java模板引擎,它允许您执行以下操作:
String result = Rythm.render("Hello @who!", "world");
以上情况表明您可以按位置将参数传递给模板。 Rythm还允许您按名称传递参数:
Map<String, Object> args = new HashMap<String, Object>();
args.put("title", "Mr.");
args.put("name", "John");
String result = Rythm.render("Hello @title @name", args);
链接:
答案 3 :(得分:1)
可以通过一些模板库来完成。但要注意,字符串在Java中是不可变的。因此,在某些低级别的情况下,将进行连接。
答案 4 :(得分:1)
你总是必须使用某种形式的连接(假设value1不是像你在这里显示的常量)。
你编写它的方式将隐式构造一个StringBuilder
并用它来连接字符串。另一种方法是String.format(String, Object...)
1 ,类似于C中的sprintf
。但即使使用format()
,也无法避免连接。
1 是的,我知道锚链接已损坏。
答案 5 :(得分:0)
您想要的是String interpolation。虽然JRuby,Groovy以及可能还有其他JVM语言可以做到这一点,但在Java中是不可能的。
编辑:对于优雅,您可以使用StringBuffer或检查其他海报的解决方案。但是在低级别,这将永远是连接,正如其他海报所说。
答案 6 :(得分:0)
您可以使用this免费库。它为您提供了 sprintf 之类的功能。或者使用String.format静态方法,前提是您使用Java 5或更新版本。
答案 7 :(得分:0)
为什么你认为字符串连接不优雅?
如果你所做的只是简单的连接,我认为代码可读性更重要,我会把它留下来就像你拥有它一样。它比使用StringBuilder更具可读性。
性能不会是大多数人认为的问题。
阅读答案 8 :(得分:0)
我会使用StringBuffer ..当你处理字符串时,这是一种常见的做法。当你第一次看到它时,它可能看起来有点像,但你会很快习惯它..
String test = new StringBuffer("text goes here ").append(value1).append(" more text").toString();
字符串是不可变的,因此在每次连接后都会创建一个新实例。在循环中使用时,这可能会导致性能问题。
StringBuffer 是 String 的可变版本 - 这意味着您可以创建一个,根据需要进行修改,但您仍然只有一个实例。如果需要,可以通过调用它的 toString()方法获得StringBuffer的String表示。
答案 9 :(得分:0)
问题不在于这是否是一种优雅的方式。使用模板系统背后的想法可能是您将模板放在普通文本文件中,如果您更改消息(或考虑i18ln),则无需更改Java代码。