在Kotlin中添加条件的for循环的优雅方式是什么
在Kotlin中执行以下代码的更优雅的方式是什么在Kotlin中添加条件的for循环的优雅方式是什么,kotlin,Kotlin,在Kotlin中执行以下代码的更优雅的方式是什么 fun bar(bars:List<Bar>): List<Foo>{ val foos = mutableListOf<Foo>() for(bar in bars){ val foo = foo(bar) if(foo != null){ foos.add(foo) } } return foos } fun foo(bar:Bar): Foo?{
fun bar(bars:List<Bar>): List<Foo>{
val foos = mutableListOf<Foo>()
for(bar in bars){
val foo = foo(bar)
if(foo != null){
foos.add(foo)
}
}
return foos
}
fun foo(bar:Bar): Foo?{
if(bar.something){
return null
}
return Foo()
}
趣味酒吧(酒吧:列表):列表{
val foos=mutableListOf()
用于(以巴为单位){
val foo=foo(巴)
如果(foo!=null){
foos.add(foo)
}
}
返回foos
}
fun foo(酒吧:酒吧):foo{
如果(某物){
返回空
}
返回Foo()
}
U可以使用mapNotNull()
val foos=bar.mapNotNull{foo(it)}
希望它足够优雅。U可以使用
mapNotNull()
val foos=bar.mapNotNull{foo(it)}
希望它足够优雅。bar()
可以重写为使用:
(我也省略了返回类型,因为编译器很容易推断出它们——尽管为了额外的安全性/可读性,您可能希望保留它们。)
这两种方法都可以很好地发挥扩展功能:
fun List<Bar>.bar() = mapNotNull{ it.foo() }
fun Bar.foo() = if (something) null else Foo()
fun List.bar()=mapNotNull{it.foo()}
fun Bar.foo()=if(something)null else foo()
bar()
可以重写为使用:
(我也省略了返回类型,因为编译器很容易推断出它们——尽管为了额外的安全性/可读性,您可能希望保留它们。)
这两种方法都可以很好地发挥扩展功能:
fun List<Bar>.bar() = mapNotNull{ it.foo() }
fun Bar.foo() = if (something) null else Foo()
fun List.bar()=mapNotNull{it.foo()}
fun Bar.foo()=if(something)null else foo()
整个过程可以简化为:
bars.filterNot { it.something }.map { Foo() }
这是因为你在做两件事:
foo
如果某个属性为false,则返回foo()
,否则返回nullbar
过滤掉非空结果Foo
对象,用于条所在的每个条。有些
是错误的,这就是它的作用
工作示例:
class Foo
data class Bar(val something: Boolean)
fun List<Bar>.toFoos(): List<Foo> = filterNot { it.something }.map { Foo() }
fun main() {
val input = listOf(Bar(true), Bar(false), Bar(false), Bar(true), Bar(true))
val output = input.toFoos()
println(output)
}
整个过程可以简化为:
bars.filterNot { it.something }.map { Foo() }
这是因为你在做两件事:
foo
如果某个属性为false,则返回foo()
,否则返回nullbar
过滤掉非空结果Foo
对象,用于条所在的每个条。有些
是错误的,这就是它的作用
工作示例:
class Foo
data class Bar(val something: Boolean)
fun List<Bar>.toFoos(): List<Foo> = filterNot { it.something }.map { Foo() }
fun main() {
val input = listOf(Bar(true), Bar(false), Bar(false), Bar(true), Bar(true))
val output = input.toFoos()
println(output)
}
这两个功能可替换为以下一个衬里:
funbar(bar:List):List=Array(bar.count{!it.something}{Foo()}.asList()
这两个功能可替换为以下一个衬里:
funbar(bar:List):List=Array(bar.count{!it.something}{Foo()}.asList()
最简单的方法是以功能性的方式编写:
fun bar(bars: List<Bar>): List<Foo> {
return bars.filter { !it.something }.map { Foo() }
}
趣味酒吧(酒吧:列表):列表{
返回bar.filter{!it.something}.map{Foo()}
}
最简单的方法是以功能性的方式编写:
fun bar(bars: List<Bar>): List<Foo> {
return bars.filter { !it.something }.map { Foo() }
}
趣味酒吧(酒吧:列表):列表{
返回bar.filter{!it.something}.map{Foo()}
}
您根本不需要在此处使用null
,只需在栏上进行筛选即可。添加了一个答案。@AdamMillerchip我将这个问题解释为希望保留这两个函数。 当然,如果您不需要保留foo()
,您可以在一行中完成整个操作。对。很难说什么时候我们只需要使用“更优雅的方式来执行以下代码”就可以了。您根本不需要在这里使用null
,只需在栏上进行筛选即可。添加了一个答案。@AdamMillerchip我将这个问题解释为希望保留这两个函数。 当然,如果您不需要保留foo()
,您可以在一行中完成整个操作。对。很难说什么时候我们只需要使用“更优雅的方式来编写下面的代码”使用filterNot()
更简单,目的更明确-但是它确实创建了列表的第三个副本,所以效率稍低。 (秋千、环岛…)它制作了一个中间列表,但它不会复制列表中的元素,因此付出的代价很小。比以后调试NullPointerException
的成本要小。只要不使用,您就不必担心NullPointerException代码>。Kotlin存在的原因有一半是因为您不再需要担心空值。只有在处理纯Kotlin代码时才是这样。一旦你有了平台类型,你就可以随时得到NPE。但这和这个例子无关,所以说得对。我仍然认为filter-then-map比mapNotNull{convertOrNull(it)}
更清晰、更有目的性。在程序流中使用null
感觉像是一种反模式。使用filterNot()
更简单、更清晰-但它确实创建了列表的第三个副本,因此效率稍低。 (秋千、环岛…)它制作了一个中间列表,但它不会复制列表中的元素,因此付出的代价很小。比以后调试NullPointerException
的成本要小。只要不使用,您就不必担心NullPointerException代码>。Kotlin存在的原因有一半是因为您不再需要担心空值。只有在处理纯Kotlin代码时才是这样。一旦你有了平台类型,你就可以随时得到NPE。但这和这个例子无关,所以说得对。我仍然认为filter then map比mapNotNull{convertOrNull(it)}
更清晰、更有意。在程序流中使用null
感觉像是一种反模式。filterNot{it.something}
filterNot{it.something}