在没有连接的情况下将Java字符串插入另一个字符串中?

时间:2009-04-21 14:56:14

标签: java string

在Java中有更优雅的方法吗?

String value1 = "Testing";  
String test = "text goes here " + value1 + " more text";

是否可以将变量直接放在字符串中并评估其值?

10 个答案:

答案 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。虽然JRubyGroovy以及可能还有其他JVM语言可以做到这一点,但在Java中是不可能的。


编辑:对于优雅,您可以使用StringBuffer或检查其他海报的解决方案。但是在低级别,这将永远是连接,正如其他海报所说。

答案 6 :(得分:0)

您可以使用this免费库。它为您提供了 sprintf 之类的功能。或者使用String.format静态方法,前提是您使用Java 5或更新版本。

答案 7 :(得分:0)

为什么你认为字符串连接不优雅?

如果你所做的只是简单的连接,我认为代码可读性更重要,我会把它留下来就像你拥有它一样。它比使用StringBuilder更具可读性。

性能不会是大多数人认为的问题。

CodingHorror

阅读

答案 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代码。