ZetCode

Java ListFormat

最后修改:2025 年 6 月 16 日

在本文中,我们将演示如何有效地使用 Java ListFormat 类。我们将探讨其在各种格式化样式中的应用,并提供使用 ListFormat 以区域设置敏感的方式格式化列表、集合和数组的实用示例。

ListFormat 类根据特定于区域设置的规则格式化对象列表。该类在 Java 22 中引入,为开发人员提供了一种现代的、国际化的列表格式化方法。它会根据指定的区域设置和样式自动处理连词和分隔符。

public final class ListFormat extends Format

上面的代码段显示了 ListFormat 的类声明,它扩展了 Format 类。它提供了将对象列表格式化为带有适当分隔符和连词的易于阅读的字符串的方法。

ListFormat 类型

ListFormat 类通过 ListFormat.Type 枚举定义了各种格式化样式。这些样式决定了列表元素在输出中如何结构化和连接。可用的类型有 STANDARDORUNIT

public enum ListFormat.Type {
    STANDARD, OR, UNIT
}

ListFormat.Type 枚举指定了格式化列表的不同方式。 STANDARD 类型使用 “and” 作为项目之间的连词,OR 用 “or” 替换 “and” 用于替代选择,UNIT 格式化没有连词的项目,适用于基于单位的列表。每种类型都会动态调整为特定于区域设置的语言规则。

ListFormat 样式

除了格式化类型之外,ListFormat 类还通过 ListFormat.Style 枚举提供多种样式。这些样式是 FULLSHORTNARROW

public enum ListFormat.Style {
    FULL, SHORT, NARROW
}
这些样式控制格式化输出中的详细程度,例如是否包含连词的完整单词或使用缩写。FULL 样式为连词提供完整的单词,而 SHORTNARROW 使用缩写形式。

基本 ListFormat 用法

此示例演示了 ListFormat 的基本用法,其中包含一个简单的字符串列表。我们使用默认区域设置和标准格式化样式来创建正确格式化的列表输出。

Main.java
void main() {

    List<String> fruits = List.of("apple", "banana", "cherry", "date");

    ListFormat listFormat = ListFormat.getInstance(Locale.US, 
            ListFormat.Type.STANDARD, ListFormat.Style.FULL);

    String formatted = listFormat.format(fruits);
    System.out.println(formatted);
}

在此示例中,我们创建一个水果名称列表并使用标准样式对其进行格式化。 ListFormat.getInstance 方法使用标准类型和完整样式为美国区域设置创建一个格式化程序。输出将是“apple, banana, cherry, and date”,带有正确的英语连词。

不同的格式化类型

此示例展示了 ListFormat 的所有三种可用格式化类型。我们使用不同的类型格式化相同的列表,以演示每种类型如何影响输出格式和连词的使用。

Main.java
void main() {

    List<String> colors = List.of("red", "blue", "green");
    
    ListFormat standardFormat = ListFormat.getInstance(Locale.US,
            ListFormat.Type.STANDARD, ListFormat.Style.FULL);
    ListFormat orFormat = ListFormat.getInstance(Locale.US,
            ListFormat.Type.OR, ListFormat.Style.FULL);
    ListFormat unitFormat = ListFormat.getInstance(Locale.US,
            ListFormat.Type.UNIT, ListFormat.Style.FULL);

    System.out.println("Standard: " + standardFormat.format(colors));
    System.out.println("Or: " + orFormat.format(colors));
    System.out.println("Unit: " + unitFormat.format(colors));
}

在这里,我们使用相同的数据演示所有三种格式化类型。标准类型生成“red, blue, and green”,OR 类型生成“red, blue, or green”,unit 类型生成“red, blue, green”没有连词。每种类型在文本格式化中都有不同的用途。

比较 ListFormat 样式

此示例演示了所有三个 ListFormat.Style 选项之间的差异:FULLSHORTNARROW。我们使用不同的样式格式化相同的列表,以显示输出中详细程度的差异。

Main.java
void main() {

    List<String> programming = List.of("Java", "Python", "JavaScript", "C++");
    
    ListFormat fullStyle = ListFormat.getInstance(Locale.US,
            ListFormat.Type.STANDARD, ListFormat.Style.FULL);
    ListFormat shortStyle = ListFormat.getInstance(Locale.US,
            ListFormat.Type.STANDARD, ListFormat.Style.SHORT);
    ListFormat narrowStyle = ListFormat.getInstance(Locale.US,
            ListFormat.Type.STANDARD, ListFormat.Style.NARROW);

    System.out.println("Full style: " + fullStyle.format(programming));
    System.out.println("Short style: " + shortStyle.format(programming));
    System.out.println("Narrow style: " + narrowStyle.format(programming));
}

此比较显示了如何使用不同的详细程度格式化同一个列表。FULL 样式为连词和分隔符提供完整的单词,SHORT 在适用的情况下使用缩写形式,而 NARROW 提供最紧凑的格式化。在具有明显连词和分隔符缩写形式的区域设置中,差异变得更加明显。

特定于区域设置的格式化

ListFormat 类使其输出适应不同的区域设置,根据语言规则更改分隔符和连词。此示例演示了同一列表在不同区域设置中的显示方式。

Main.java
void main() {

    List<String> countries = List.of("France", "Germany", "Italy");
    
    ListFormat englishFormat = ListFormat.getInstance(Locale.ENGLISH,
            ListFormat.Type.STANDARD, ListFormat.Style.FULL);
    ListFormat frenchFormat = ListFormat.getInstance(Locale.FRENCH,
            ListFormat.Type.STANDARD, ListFormat.Style.FULL);
    ListFormat germanFormat = ListFormat.getInstance(Locale.GERMAN,
            ListFormat.Type.STANDARD, ListFormat.Style.FULL);

    System.out.println("English: " + englishFormat.format(countries));
    System.out.println("French: " + frenchFormat.format(countries));
    System.out.println("German: " + germanFormat.format(countries));
}

在此示例中,我们使用不同的区域设置格式化相同的国家/地区列表。每个区域设置都应用其自己的语言规则进行列表格式化。英文版本使用“and”,而法语和德语使用它们各自的连词(“et”和“und”)。这证明了 ListFormat 的国际化功能。

格式化列表和数组

ListFormat 类可以格式化列表和数组。

Main.java
void main() {

    String[] arrayData = { "Monday", "Tuesday", "Wednesday" };
    List<String> listData = List.of("January", "February", "March");

    ListFormat formatter = ListFormat.getInstance(Locale.US,
            ListFormat.Type.STANDARD, ListFormat.Style.FULL);

    System.out.println("Array: " + formatter.format(arrayData));
    System.out.println("List: " + formatter.format(listData));
}

在此示例中,我们使用相同的格式化程序实例格式化数组和列表。T

自定义对象格式化

ListFormat 类通过调用自定义对象的 toString 方法来使用它们。此示例演示了如何格式化包含自定义对象的列表,以及如何控制它们的字符串表示以获得更好的格式化结果。

Main.java
class Product {

    private String name;
    private double price;

    public Product(String name, double price) {
        this.name = name;
        this.price = price;
    }

    @Override
    public String toString() {
        return name + " ($" + String.format("%.2f", price) + ")";
    }
}

void main() {

    List<Product> products = List.of(
            new Product("Laptop", 999.99),
            new Product("Mouse", 25.50),
            new Product("Keyboard", 75.00));

    ListFormat formatter = ListFormat.getInstance(Locale.US,
            ListFormat.Type.STANDARD, ListFormat.Style.FULL);

    String formatted = formatter.format(products);
    System.out.println("Products: " + formatted);
}

在这种情况下,我们定义了一个带有自定义 toString 实现的 Product 类。格式化产品列表时,ListFormat 会自动使用此方法。我们创建一个 Product 对象列表,并使用标准样式对其进行格式化。输出显示了每种产品及其价格,并使用逗号和连词进行了正确的格式化。

来源

Java 语言基础 - 教程

在本文中,我们深入探讨了 Java ListFormat 类。我们介绍了特定于区域设置的列表格式化的概念,并演示了它在不同样式、区域设置和数据结构中的使用,从而全面了解了这种强大的格式化工具。

作者

我叫 Jan Bodnar,是一名敬业的程序员,在该领域拥有多年的经验。我于 2007 年开始撰写编程文章,至今已撰写了 1,400 多篇文章和 8 本电子书。凭借超过八年的教学经验,我致力于分享我的知识并帮助他人掌握编程概念。

列出所有Java教程