【问题标题】:Kotlin - How to correctly concatenate a StringKotlin - 如何正确连接字符串
【发布时间】:2017-05-25 19:18:17
【问题描述】:

一个非常基本的问题,在 Kotlin 中连接字符串的正确方法是什么?

在 Java 中,您将使用 concat() 方法,例如

String a = "Hello ";
String b = a.concat("World"); // b = Hello World

concat() 函数不适用于 Kotlin。我应该使用+ 符号吗?

【问题讨论】:

    标签: string kotlin


    【解决方案1】:

    字符串模板/插值

    在 Kotlin 中,您可以使用 String interpolation/templates 进行连接:

    val a = "Hello"
    val b = "World"
    val c = "$a $b"
    

    输出将是:Hello World

    或者您可以使用StringBuilder 显式连接。

    val a = "Hello"
    val b = "World"
    
    val sb = StringBuilder()
    sb.append(a).append(b)
    val c = sb.toString()
    
    print(c)
    

    输出将是:HelloWorld

    新建字符串对象

    或者您可以使用+ / plus() 运算符连接:

    val a = "Hello"
    val b = "World"
    val c = a + b   // same as calling operator function a.plus(b)
    
    print(c)
    

    输出将是:HelloWorld

    • 这将创建一个新的 String 对象。

    【讨论】:

    • 运算符“+”被翻译成plus(),所以你可以写a.plus(b)a + b,生成相同的字节码
    • 我查看了字节码和字符串插值在内部使用 StringBuilder
    • @crgarridos,这是否意味着 Kotlin 使用字符串插值进行连接 "Hello" + "Word" 与使用 StringBuilder 附加到字符串 someHelloStringBuilder.append("World") 一样高效?
    • 字符串插值是指对文字字符串内部变量的解析。所以技术上是的。
    • 字符串插值和连接都在内部使用 StringBuilder。我在字节码中注意到的唯一区别是,如果两个变量之间只有一个字符,则插值对这个字符使用 append(Char) 而不是 append(String)。所以我会说它只是语法糖。当对单个变量进行多个连接时,使用 StringBuilder 很重要,例如。 G。在 for 循环中。
    【解决方案2】:

    kotlin.String 有一个plus 方法:

    a.plus(b)
    

    详情请见https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/plus.html

    【讨论】:

    • + 操作符是正常的,没有调用翻译后的操作符函数plus ...这不是惯用的
    • 你为什么这么认为?
    • 别忘了像我一样影响你的结果,比如a = a.plus(b)
    • @lorenzo 的评论解释了为什么这个答案不如上述解决方案。当连接依赖于多个 if 语句时,plus() 不如 StringBuilder 的 append 方法实用,即。
    【解决方案3】:

    我同意上面接受的答案,但它只适用于已知的字符串值。 对于动态字符串值,这是我的建议。

    // A list may come from an API JSON like
    {
       "names": [
          "Person 1",
          "Person 2",
          "Person 3",
             ...
          "Person N"
       ]
    }
    var listOfNames = mutableListOf<String>() 
    
    val stringOfNames = listOfNames.joinToString(", ") 
    // ", " <- a separator for the strings, could be any string that you want
    
    // Posible result
    // Person 1, Person 2, Person 3, ..., Person N
    

    这对于用分隔符连接字符串列表很有用。

    【讨论】:

      【解决方案4】:

      是的,您可以使用+ 符号进行连接。 Kotlin 有字符串模板,所以最好像这样使用它们:

      var fn = "Hello"
      var ln = "World"
      

      "$fn $ln" 用于连接。

      您甚至可以使用String.plus() 方法。

      【讨论】:

      • + 操作符是正常的,没有调用翻译后的操作符函数plus ...这不是惯用的
      • 您能解释一下为什么您认为 + 的加号版本不习惯吗?
      【解决方案5】:

      试试这个,我认为这是在 Kotlin 中连接字符串的原生方式:

      val result = buildString{
          append("a")
          append("b")
      }
      
      println(result)
      
      // you will see "ab" in console.
      

      【讨论】:

      • 它是buildString { 而不是stringBuild {
      • @arnonuem 我已经修复了它(你应该可以随意这样做)。
      【解决方案6】:

      类似于@Rhusfer answer 我写了这个。如果您有一组 EditTexts 并且想要连接它们的值,您可以这样写:

      listOf(edit_1, edit_2, edit_3, edit_4).joinToString(separator = "") { it.text.toString() }
      

      如果你想连接Map,使用这个:

      map.entries.joinToString(separator = ", ")
      

      连接Bundleuse

      bundle.keySet().joinToString(", ") { key -> "$key=${bundle[key]}" }
      

      它按字母顺序对键进行排序。

      例子:

      val map: MutableMap<String, Any> = mutableMapOf("price" to 20.5)
      map += "arrange" to 0
      map += "title" to "Night cream"
      println(map.entries.joinToString(separator = ", "))
      
      // price=20.5, arrange=0, title=Night cream
      
      val bundle = bundleOf("price" to 20.5)
      bundle.putAll(bundleOf("arrange" to 0))
      bundle.putAll(bundleOf("title" to "Night cream"))
      val bundleString =
          bundle.keySet().joinToString(", ") { key -> "$key=${bundle[key]}" }
      println(bundleString)
      
      // arrange=0, price=20.5, title=Night cream
      

      【讨论】:

        【解决方案7】:

        在 kotlin 中有多种连接字符串的方法 示例 -

        a = "Hello" , b= "World"
        
        1. 使用 + 运算符 a+b

        2. 使用plus() 运算符

          a.plus(b)

        注意 - + 仅在内部转换为 .plus() 方法

        在上述两种方法中,由于字符串是不可变的,因此创建了一个新的字符串对象。如果我们想修改现有的字符串,我们可以使用 StringBuilder

        StringBuilder str = StringBuilder("Hello").append("World")
        

        【讨论】:

          【解决方案8】:

          yourString += "newString"

          这样你可以连接一个字符串

          【讨论】:

            【解决方案9】:

            我建议如果您有一组有限且预定义的值,那么最有效和可读的方法是使用字符串模板(它使用字符串生成器来执行连接)。

            val a = "Hello"
            val b = "World"
            val c = "$a  ${b.toUpperCase()} !"
            
            println(c) //prints: Hello  WORLD !
            

            另一方面,如果您有一组值,则使用 joinToString 方法。

            val res = (1..100).joinToString(",")
            println(res) //prints: 1,2,3,...,100
            

            我认为这篇文章中一些建议的解决方案效率不高。就像使用加号或 + 或为一组有限的条目创建一个集合,然后在它们上应用 joinToString

            【讨论】:

              【解决方案10】:

              如果你有一个对象并且想要连接一个对象的两个值,比如

              data class Person(
              val firstName: String,
              val lastName: String
              )
              

              那么简单的跟随是行不通的

              val c = "$person.firstName $person.lastName"
              

              在这种情况下正确的方法是

              "${person.firstName} ${person.lastName}"
              

              如果你想在连接的值之间有任何字符串,只需写在那里而不需要任何帮助符号。例如,如果我想要“Name is”,然后在名字和姓氏之间加一个连字符

               "Name is ${person.firstName}-${person.lastName}"
              

              【讨论】:

                【解决方案11】:

                目前最简单的方法,它将添加分隔符从连接中排除空/空字符串

                val finalString = listOf(a, b, c)
                    .filterNot { it.isNullOrBlank() }
                    .joinToString(separator = " ")
                

                【讨论】:

                  【解决方案12】:

                  在 Kotlin 中,我们可以使用 joinToString() 连接字符串数组

                  val tags=arrayOf("hi","bye")
                  
                  val finalString=tags.joinToString (separator = ","){ "#$it" }
                  

                  结果是:

                  #嗨,#再见


                  如果列表来自服务器

                  var tags = mutableListOf<Tags>() // list from server
                  
                  val finalString=tags.joinToString (separator = "-"){ "#${it.tagname}" }
                  

                  结果是:

                  #hi-#再见

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2023-03-23
                    • 1970-01-01
                    • 1970-01-01
                    • 2017-03-25
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2017-03-27
                    相关资源
                    最近更新 更多