跳转至

深入理解 Java 中的 .formatted 方法

简介

在 Java 中,字符串格式化是一项常见的操作,它允许我们以特定的格式呈现数据。.formatted 方法是 Java 15 引入的用于字符串格式化的新特性,为开发者提供了一种简洁且强大的方式来格式化文本。它基于传统的 String.format 方法,但在语法和功能上有一些改进,使得代码更加易读和易用。本文将详细介绍 .formatted 方法的基础概念、使用方法、常见实践以及最佳实践。

目录

  1. 基础概念
  2. 使用方法
    • 基本格式化
    • 位置参数
    • 格式化选项
  3. 常见实践
    • 数字格式化
    • 日期和时间格式化
    • 字符串填充和对齐
  4. 最佳实践
    • 代码可读性
    • 性能考量
    • 错误处理
  5. 小结
  6. 参考资料

基础概念

.formatted 方法是 java.lang.String 类的实例方法。它允许我们通过占位符将变量值嵌入到字符串中,并按照指定的格式进行呈现。占位符用 % 字符开头,后面跟着表示数据类型和格式化选项的字符。例如,%d 用于格式化整数,%f 用于格式化浮点数。

使用方法

基本格式化

最基本的使用方式是在字符串中包含占位符,然后调用 .formatted 方法并传入相应的值。

public class BasicFormattedExample {
    public static void main(String[] args) {
        String name = "Alice";
        int age = 30;
        String message = "My name is %s and I am %d years old.".formatted(name, age);
        System.out.println(message);
    }
}

在上述代码中,%s 是字符串占位符,%d 是整数占位符。.formatted 方法将 nameage 的值分别替换到对应的占位符位置。

位置参数

可以通过在占位符中指定位置参数来控制值的替换顺序。

public class PositionArgumentExample {
    public static void main(String[] args) {
        String fruit = "apple";
        int quantity = 5;
        String message = "I bought %2$d %1$s.".formatted(fruit, quantity);
        System.out.println(message);
    }
}

这里 %2$d 表示第二个参数作为整数格式化,%1$s 表示第一个参数作为字符串格式化。

格式化选项

格式化选项可以进一步控制数据的呈现方式,如宽度、精度、对齐方式等。

public class FormatOptionExample {
    public static void main(String[] args) {
        double price = 123.456;
        // 格式化浮点数,宽度为 10,保留 2 位小数
        String message = "The price is %10.2f.".formatted(price);
        System.out.println(message);
    }
}

在这个例子中,%10.2f 表示浮点数宽度为 10,保留 2 位小数。

常见实践

数字格式化

数字格式化在很多场景中都非常有用,比如货币显示、统计数据展示等。

public class NumberFormattingExample {
    public static void main(String[] args) {
        int number = 123456;
        // 使用分组分隔符格式化整数
        String formattedNumber = "The number is %,d.".formatted(number);
        System.out.println(formattedNumber);

        double pi = 3.1415926;
        // 格式化浮点数,保留 3 位小数
        String formattedPi = "Pi is approximately %.3f.".formatted(pi);
        System.out.println(formattedPi);
    }
}

日期和时间格式化

Java 中的日期和时间格式化可以帮助我们以特定的格式呈现时间信息。

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class DateTimeFormattingExample {
    public static void main(String[] args) {
        LocalDateTime now = LocalDateTime.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String formattedDateTime = "Current time is %s".formatted(now.format(formatter));
        System.out.println(formattedDateTime);
    }
}

字符串填充和对齐

在一些情况下,我们需要对字符串进行填充和对齐,以达到美观的输出效果。

public class StringPaddingAndAlignmentExample {
    public static void main(String[] args) {
        String text = "Java";
        // 左对齐,宽度为 10,用空格填充
        String leftAligned = "|%-10s|".formatted(text);
        // 右对齐,宽度为 10,用空格填充
        String rightAligned = "|%10s|".formatted(text);
        // 居中对齐,宽度为 10,用空格填充
        String centered = "|%^10s|".formatted(text);

        System.out.println(leftAligned);
        System.out.println(rightAligned);
        System.out.println(centered);
    }
}

最佳实践

代码可读性

使用 .formatted 方法时,尽量保持占位符和参数的清晰对应。避免使用过于复杂的格式化字符串,以免降低代码的可读性。

性能考量

在循环中频繁使用 .formatted 方法可能会影响性能。如果性能是关键因素,可以考虑使用 StringBuilder 或者预编译的 MessageFormat

错误处理

当传入的参数类型与占位符不匹配时,.formatted 方法会抛出 IllegalFormatConversionException。在实际应用中,应该进行适当的错误处理,以确保程序的稳定性。

小结

.formatted 方法为 Java 开发者提供了一种方便、简洁的字符串格式化方式。通过了解其基础概念、使用方法、常见实践和最佳实践,我们能够更加高效地处理字符串格式化任务,使代码更加清晰和易于维护。无论是简单的文本嵌入还是复杂的格式化需求,.formatted 方法都能满足我们的要求。

参考资料