Map和orElse返回不同​​的子类型

bdh*_*har 4 java lambda compiler-errors

我有两个功能-一个返回Set<String>,另一个返回List<String>

private static List<String> getStringList(final String factor) {
    ....
}

private static Set<String> getStringSet() {
    ....
}
Run Code Online (Sandbox Code Playgroud)

现在,我有一个函数可以返回a Collection<String>,然后根据特定条件依次调用上述函数。我想做这样的事情:

private static Collection<String> getStringCollection() {
    Optional<String> factor = getFactor();
    return factor.filter(LambdaTest::someCondition)
            .map(LambdaTest::getStringList)
            .orElse(getStringSet());
}
Run Code Online (Sandbox Code Playgroud)

但是我得到这个错误

错误:(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();
}
Run Code Online (Sandbox Code Playgroud)

Mur*_*nik 5

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

return factor.filter(LambdaTest::someCondition)
             .<Collection<String>> map(LambdaTest::getStringList)
             .orElse(getStringSet());
Run Code Online (Sandbox Code Playgroud)