如何调用Stream.map()内部的函数

问题描述 投票:0回答:1

我正在使用

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
无法识别。

我错过了什么?

java lambda java-8 java-stream
1个回答
2
投票

当您向

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
(如果存在)的附加步骤。

© www.soinside.com 2019 - 2024. All rights reserved.