Kotlin申请String无法正常工作

时间:2018-08-09 14:53:09

标签: android kotlin syntactic-sugar

我正在尝试使用kotlin的所有功能,但似乎其中一些功能无法正常工作,或者可能是我的错。

因此,applyString不起作用。示例:

val str = someStr.apply {
    toUpperCase()
    if (contains("W")) replace("W", "w")
}
  

输入-> xywz

     

输出-> xywz

     

预期-> XYwZ

Java风格:

val str = it.text().toString().toUpperCase()
if (str.contains("W")) str.replace("W", "w")
  

输入-> xywz

     

输出-> XYwZ

     

预期-> XYwZ

我做错什么了吗?

3 个答案:

答案 0 :(得分:4)

toUpperCase()返回字符串的副本(字符串是不可变的)。因此,您需要存储返回的值,因为它会丢失apply()中的独立(不是最后)语句。

此外,如果返回表达式,则不能在没有if的情况下使用else。您甚至不需要contains()

您可能想做的是直接致电toUpperCase()replace()

val str = someStr.toUpperCase().replace("W", "w")

答案 1 :(得分:2)

实际上apply不会返回您计算出的值。您可能更想使用:runletwith。另外,可能更重要的是您没有指定else路径。这可能会返回一个Unit而不是一个值,因此您可能想要指定否则应返回的内容。最后,这些方法中的调用没有链接。首先调用toUpperCase并不会改变任何内容……这几乎是无效的代码……所以您可能想要编写如下内容:

val str = with(someStr) {
  toUpperCase().run {
    if (contains("W")) replace("W", "w")
    else this
  }
}

但是,我刚刚使用run / let / with演示了它的用法,就像您已经使用了apply ...在这方面,您所展示的Java方式当然更容易,而最简单的解决方案就是TheOperator首先忽略您的情况,因为replace默认情况下区分大小写。

答案 2 :(得分:0)

“应用”文档:

以该值作为其接收者调用指定的功能块,并 返回此值。

因此它返回原始值(“此值”)。

您应该使用“ let”代替:

val str = someStr.let {
    it.toUpperCase().replace("W", "w")
}

但是您可以使用:

val str = someStr.toUpperCase().replace("W", "w")