在Kotlin中添加条件的for循环的优雅方式是什么

在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?{

在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?{
  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()
    ,否则返回null
  • bar
    过滤掉非空结果
  • 因此,您需要的是
    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()
    ,否则返回null
  • bar
    过滤掉非空结果
  • 因此,您需要的是
    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}