如何在Java Stream.map()方法中调用自定义函数生成Country对象
你的写法存在两处核心问题:
- 作用域内不存在名为
locale的变量:你在map参数里直接写createCountry(locale)时,没有对应变量可用,Stream中上一步流转的Locale实例需要作为参数传入你的自定义方法 - 你传入
map的是方法执行结果,而非函数对象:Stream的map方法需要接收一个可以逐个处理元素的Function实例,直接写方法调用会立刻执行,不符合要求
修正代码
你可以直接用lambda接收上一步生成的Locale实例,传入createCountry方法,再处理返回的Optional即可,完整代码如下:
return Stream.of(Locale.getISOCountries()) .map(countryCode -> new Locale(language, countryCode)) .map(locale -> createCountry(locale)) .flatMap(Optional::stream) // 自动过滤空Optional,提取有效Country对象 .collect(Collectors.toList());
如果使用JDK 8版本,没有Optional::stream方法,可以替换为兼容写法:
return Stream.of(Locale.getISOCountries()) .map(countryCode -> new Locale(language, countryCode)) .map(this::createCountry) // 实例方法用this::方法名简化写法,静态方法替换为类名::方法名 .filter(Optional::isPresent) .map(Optional::get) .collect(Collectors.toList());
额外说明
你原来写的非空判断filter可以直接移除,createCountry已经做了异常捕获,无效项会直接返回空Optional被过滤。如果你的Country构造方法本身不会对空code/name抛异常,你可以在createCountry里补充对应校验逻辑,不符合要求直接返回Optional.empty()即可。
内容的提问来源于stack exchange,提问作者user9347049
相关产品推荐
相关产品推荐

