我正在使用
java.util.Locale
获取国家/地区列表。
我的代码如下所示:
List<Country> countries = new ArrayList<>();
String[] countryCodes = Locale.getISOCountries();
for (String countryCode : countryCodes) {
Locale locale = new Locale(language, countryCode);
String code = locale.getCountry();
String name = locale.getDisplayCountry(locale);
try {
countries.add(new Country(code, name));
} catch (IllegalArgumentException e) {
// code and name not valid for creating country. ignore
}
}
return countries;
而且效果很好。我想使用 Java Streams 转换此代码。
我是这样开始的:
return Stream.of(Locale.getISOCountries())
.map(countryCode -> new Locale(language, countryCode))
.map(c-> new Country(c.getCountry(), c.getDisplayCountry()))
.filter(c-> !(c.getCode().equals("")) && !(c.getName().equals("")))
.collect(Collectors.toList());
但是不是这行代码
.map(c-> new Country(c.getCountry(), c.getDisplayCountry()))
我想调用这个函数:
private Optional<Country> createCountry(Locale locale) {
try {
return Optional.of(new Country(locale.getCountry(), locale.getDisplayCountry(locale)));
} catch (IllegalArgumentException e) {
return Optional.empty();
}
}
我正在考虑做这样的事情:
.map(createCountry(locale))
但是功能和
locale
无法识别。
我错过了什么?
当您向
map
方法提供方法调用的结果(即 Function
)时,它会接受 Optional<Country>
。您需要传入方法引用来代替:
List<Country> countries = Stream.of(Locale.getISOCountries())
.map(countryCode -> new Locale(language, countryCode))
.map(this::createCountry)
.filter(Optional::isPresent)
.map(Optional::get)
.filter(c -> !(c.getCode().equals("")) && !(c.getName().equals("")))
.collect(Collectors.toList());
请注意将可选映射到
Country
(如果存在)的附加步骤。