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