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