Functional programming 为什么Kotlin中的chaining.map()和.filter()不能按预期工作?

Functional programming 为什么Kotlin中的chaining.map()和.filter()不能按预期工作?,functional-programming,kotlin,java-stream,Functional Programming,Kotlin,Java Stream,我试图将一个对象列表映射到另一种类型的对象列表,然后过滤该列表,然后映射到第三种类型的列表,就像我在Java 8+中链接流所做的那样(我更改了类和变量名以使其更有意义,但结构与我的代码中相同): 如果我对过滤器谓词使用匿名函数,它可以很好地编译: .filter (fun(account):Boolean{ if(validateAccount(account)){ // do something here lik

我试图将一个对象列表映射到另一种类型的对象列表,然后过滤该列表,然后映射到第三种类型的列表,就像我在Java 8+中链接流所做的那样(我更改了类和变量名以使其更有意义,但结构与我的代码中相同):

如果我对过滤器谓词使用匿名函数,它可以很好地编译:

.filter (fun(account):Boolean{
                if(validateAccount(account)){ 
                        // do something here like logging
                        return true
                    }
                    // do something else...
                    return false
            })
为什么在这种情况下类型推断会失败


我是否可以用一个lambda使其工作?

返回
从最近的封闭函数或匿名函数返回(这是
有趣的形式(a1:T1,…,an:TN):TR=…
)。助记符是一个非限定的
返回
上升到最近的
fun
。lambda不是匿名函数,因此
返回
实际上是从包含整个
映射
/
过滤器
表达式的函数返回的。您可以使用带标签的退货:

val results: List<AccountDto> = listOfPersons
                .map(::getPersonAccount)
                .filter { account ->
                    if(validateAccount(account)){
                        // etc.
                        return@filter true
                    }
                    // etc.
                    return@filter false
                }
                .map(::toDto)

得到该错误是因为lambda中的纯
返回
往往从最外层的作用域返回,即函数本身

lambda期望隐式返回(每个执行路径上的最后一个表达式)或显式标记返回
return@filter


删除
返回
s或将其替换为
return@filter
将修复错误。

谢谢,我没有意识到这一点。正如你所看到的,我是一个科特林·努布;)美好的谢谢完整的例子!我改变了这个答案,因为它更完整。
.filter (fun(account):Boolean{
                if(validateAccount(account)){ 
                        // do something here like logging
                        return true
                    }
                    // do something else...
                    return false
            })
val results: List<AccountDto> = listOfPersons
                .map(::getPersonAccount)
                .filter { account ->
                    if(validateAccount(account)){
                        // etc.
                        return@filter true
                    }
                    // etc.
                    return@filter false
                }
                .map(::toDto)
val results: List<AccountDto> = listOfPersons
                .map(::getPersonAccount)
                .filter lam@{ account ->
                    if(validateAccount(account)){
                        // etc.
                        return@lam true
                    }
                    // etc.
                    return@lam false
                }
                .map(::toDto)
val results: List<AccountDto> = listOfPersons
                .map(::getPersonAccount)
                .filter { account ->
                    if(validateAccount(account)) {
                        // etc.
                        true
                    } else {
                        // etc.
                        false
                    }
                }
                .map(::toDto)