java - Map 和 orElse 返回不同的子类型
问题描述
我有两个功能 - 一个返回Set<String>
,另一个返回List<String>
。
private static List<String> getStringList(final String factor) {
....
}
private static Set<String> getStringSet() {
....
}
现在,我有一个返回 a 的函数,Collection<String>
该函数又根据特定条件调用上述函数。我想做这样的事情:
private static Collection<String> getStringCollection() {
Optional<String> factor = getFactor();
return factor.filter(LambdaTest::someCondition)
.map(LambdaTest::getStringList)
.orElse(getStringSet());
}
但我得到这个错误
错误:(24, 37) java:不兼容的类型:java.util.Set 无法转换为 java.util.List
我能理解这里发生了什么。但是有没有办法实现类似的东西,而无需像这样复杂的 if-else 语句?
private static Collection<String> getStringCollection() {
Optional<String> factor = getFactor();
if(factor.isPresent() && someCondition(factor.get())) {
return getStringList(factor.get());
}
return getStringSet();
}
解决方案
您可以使用泛型类型规范强制getStringList
被视为Collection<String>
:
return factor.filter(LambdaTest::someCondition)
.<Collection<String>> map(LambdaTest::getStringList)
.orElse(getStringSet());
推荐阅读
- amazon-web-services - 我收到有关我的 ec2 实例的亚马逊滥用报告。如何解决这个问题?
- swift - 为什么 UISwipeActionsConfiguration 图标超出屏幕范围?
- ios - UISlider iOS,带有不同级别的图像
- r - 如何使用在 renderUI 的 selectInput 中选择的选项在主面板中生成不同的输出?
- java - 如何在 Activity 类中实现方法
- python - 使用 python api O365 接收电子邮件
- c++ - 使用 Qt 的简单 WebKit2 示例
- google-chrome - Angular 6 异步数据加载与多个选项卡 - 冻结 UI
- angular - 在 mat-tab 内带有 mat-select 的 mat-icon
- java - 如果在 if 条件下使用 hashmap 的 isEmpty() 和 size() 有什么区别?