在没有连接的情况下将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(); 

字符串是不可变的,因此在每次连接后都会创建一个新实例。 在循环中使用时,这可能会导致性能问题。

StringBufferString的可变版本 – 这意味着你可以创建一个,根据需要修改它,你仍然只有一个实例。 如果需要,您可以通过调用它的toString()方法获取StringBuffer的String表示forms。

如果这是一种优雅的方式,问题不在于此。 使用模板系统背后的想法可能是您将模板放在普通文本文件中,如果您更改消息(或考虑i18ln),则无需更改Java代码。