为了账号安全,请及时绑定邮箱和手机立即绑定

Map 和 orElse 返回不同的子类型

Map 和 orElse 返回不同的子类型

慕容3067478 2023-03-17 15:05:07
我有两个功能 - 一个返回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();}
查看完整描述

2 回答

?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

您可以使用通用类型规范来强制getStringList将其视为Collection<String>

return factor.filter(LambdaTest::someCondition)
             .<Collection<String>> map(LambdaTest::getStringList)
             .orElse(getStringSet());


查看完整回答
反对 回复 2023-03-17
?
达令说

TA贡献1821条经验 获得超6个赞

不确定这是否明显并在问题的后半部分说明,但您还可以做的是更改方法的签名getStringList以返回 a Collection<String>,保持其实现与之前相同。


这样完整的实现看起来像:


Collection<String> getStringList(final String factor) { ... }


Set<String> getStringSet() { ... }


private Collection<String> getStringCollection() {

    Optional<String> factor = getFactor();

    return factor.filter(this::someCondition)

            .map(this::getStringList)

            .orElseGet(this::getStringSet);

}

另一种选择是初始化SetinorElse以返回Listusing new ArrayList<>:


private Collection<String> getStringCollection() {

    Optional<String> factor = getFactor();

    return factor.filter(this::someCondition)

            .map(this::getStringList)

            .orElse(new ArrayList<>(getStringSet()));

}


查看完整回答
反对 回复 2023-03-17
  • 2 回答
  • 0 关注
  • 116 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号