将String.format调用转换为String#formatted的简便方法是什么?

5

自Java 15以来,String.format可以使用String#formatted替代。

有没有一种简单的方法可以替换它?

String.format("%s foo %s bar", bar(), foo());

在IntellIJ IDEA Ultimate中,使用这个功能是什么?
"%s foo %s bar".formatted(bar(), foo());
2个回答

3
对于这段代码,你可以在 IntelliJ Idea 中按下 ctrl+R 并点击 .* 图标,使用正则表达式替换。
(见enter image description here
正则表达式(见示例):String.format\((\".*\")?\, ?(.*)\); 替换(在相同示例中):$1.formatted\($2\); 我必须提醒您有多个不要这样做的原因:
  • 只是因为该方法较新而替换该方法是没有意义和好处的。代码不会变得更易维护、更易读取甚至更快。
  • 您确定需要使用此方法吗?这个方法的优点在于字符串的格式模式是连续构建的,因此直接使用formatted方法非常方便。我在我的另一个答案中描述了这一点。
  • 基于正则表达式的替换在这种大规模情况下是不安全和可靠的。正则表达式本身也严重依赖于格式模式中不存在奇怪字符。否则,您将花费大量时间来精细调整正则表达式。
如果你仍想这样做的更好方法是手动查找这些方法并替换它们。在这种情况下,使用ctrl+shift+F 进行全文搜索,并以此模式进行搜索。
String\.format

enter image description here


1
不限于一个文件。您可以按下ctrl + shift + r,打开一个窗口,在其中替换与掩码匹配的每个文件中的内容。 - genericStackOverflowUser
@genericStackOverflowUser:IntelliJ Idea 真是让我惊喜不断。 - Nikolas Charalambidis

1
按下 ctrl+shift+R 可以一次性选择并替换项目中所有文本的出现位置。

Replace Text

选择正则表达式模式并搜索文本 -
String[.]format[(](.+?),

替换文本 -
$1.formatted\(

注意,我同意被接受的答案。在大规模的正则表达式替换中,是不安全和可靠的。我可以想到一些情况,在这个答案中,如果代码稍微有一点变化,正则表达式替换就不能正常工作。

格式表达式内部包含逗号

String.format("%s foo, %s bar", bar(), foo());

Extra spaces in between

String.format ( "%s foo, %s bar", bar(), foo());

代码由新行分隔
String.
       format("%s foo %s bar", bar(), foo());

String.format("%s foo " +
                "%s bar", bar(), foo());

如果格式字符串包含逗号,这种方法就行不通了,而在我的经验中,这种情况很常见。 - Bohemian
@Bohemian 我更新了答案并列出了相关风险。 - SKumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接