Java中如何按出现顺序将字符串内%d替换为对应数值
问题根因
你之前的代码运行失败的核心原因非常明确:String.format() 不会修改传入的原始字符串,Java中String是不可变对象,该方法执行后会将格式化完成的结果作为全新的字符串返回。你之前的写法调用方法后没有接收返回值,打印的始终是列表里存的原始模板字符串,自然看不到占位符替换的效果。
正确实现代码
你只需要接收String.format()的返回值即可完成需求,推荐动态获取年份避免硬编码,示例如下:
import java.util.ArrayList; import java.util.List; import java.time.Year; public class StringFormatTest { public static void main(String[] args) { List<String> templateList = new ArrayList<>(); templateList.add("Hello this is %d next year is %d"); templateList.add("I am in %d and we will be in %d"); // 动态获取当前年份,若需要固定输出2021、2022直接给currentYear赋值2021即可 int currentYear = Year.now().getValue(); int nextYear = currentYear + 1; for (String template : templateList) { // 接收格式化后返回的新字符串 String result = String.format(template, currentYear, nextYear); System.out.println(result); } } }
运行后输出结果:
Hello this is 2024 next year is 2025 I am in 2024 and we will be in 2025
如果你需要用Stream方式实现,可以参考如下写法:
int currentYear = 2021; int nextYear = currentYear + 1; templateList.stream() .map(template -> String.format(template, currentYear, nextYear)) .forEach(System.out::println);
执行后将输出你预期的固定结果:
Hello this is 2021 next year is 2022 I am in 2021 and we will be in 2022
注意事项
%d是整数类型占位符,传入的参数必须是整数类型,否则会抛出类型匹配异常- 模板字符串中的占位符数量需要和传入的参数数量一致,缺省会抛出
MissingFormatArgumentException - 所有针对String的修改、替换、格式化操作都不会改变原始字符串,必须接收方法返回值才能拿到处理后的结果
内容的提问来源于stack exchange,提问作者Satya ram
相关产品推荐
相关产品推荐

