首页 > 解决方案 > 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();
}

标签: javalambdacompiler-errors

解决方案


您可以使用泛型类型规范强制getStringList被视为Collection<String>

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

推荐阅读