更清晰的方法来检查字符串是否是Java中ISO语言的ISO国家

mat*_*boy 12 java validation iso apache-commons guava

假设有两个字符String,应代表ISO 639国家或语言名称.

你知道,Localeclass有两个函数getISOLanguages,getISOCountries它们分别返回一个String包含所有ISO语言和ISO国家的数组.

要检查特定String对象是否是有效的ISO语言或ISO国家/地区,我应该查看该数组中的匹配项String.好的,我可以通过使用二进制搜索(例如Arrays.binarySearch,ApacheCommons ArrayUtils.contains)来做到这一点.

问题是:存在任何提供更清洁方式的实用程序(例如来自GuavaApache Commons库),例如返回a boolean以验证String作为有效ISO 639语言或ISO 639国家/地区的函数

例如:

public static boolean isValidISOLanguage(String s)
public static boolean isValidISOCountry(String s)
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 20

我不打算使用二进制搜索或任何第三方库 - 这样HashSet做很好:

public final class IsoUtil {
    private static final Set<String> ISO_LANGUAGES = new HashSet<String>
        (Arrays.asList(Locale.getISOLanguages()));
    private static final Set<String> ISO_COUNTRIES = new HashSet<String>
        (Arrays.asList(Locale.getISOCountries()));

    private IsoUtil() {}

    public static boolean isValidISOLanguage(String s) {
        return ISO_LANGUAGES.contains(s);
    }

    public static boolean isValidISOCountry(String s) {
        return ISO_COUNTRIES.contains(s);
    }
}
Run Code Online (Sandbox Code Playgroud)

可以先检查字符串长度,但我不确定我是否会打扰 - 至少除非你想要保护自己免受性能攻击的影响,否则会给你带来很长时间的大量字符串.

编辑:如果你希望使用第三方库,ICU4J是最有可能的竞争者-但可能有更先进的最新列表比支持的人Locale,所以你会想要移动到任何地方使用ICU4J,大概.

  • @mat_boy如果您已经在使用Guava,可以使用[`ImmutableSet`](http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/collect/ImmutableSet .html)这是静态最终常量的完美用例,加上代码不那么混乱:`private static final Set <String> ISO_LANGUAGES = ImmutableSet.copyOf(Locale.getISOLanguages());` (3认同)