学点kotlin,这辈子也是有了(1/n)

Kotlin不会一点

  • 声明:

    • val, var(mutable)
  • 基本数据类型(基本大差不差)

    • 数字:
      • Int, Uint(32u), Long(1_000_000)
      • Float(3.14f), Double
    • 字符串
      • Char, String
        • String自带length属性
        • String有着.startwWith() .lastWith()方法
    • 特殊对象
      • List -> listOfmutableList
      • Map -> mapOfmutableMap
  • 基本控制流

    • 分支控制:

      • ifif只能放Boolean来进行判断,可以用类似Cval c: Int = if(a < b) a else b

      • when(obj):多分支,类似switch(),但是使用val1 -> { fun1() } else { fun2() }格式进行操作

        • 可支持下列用法:可是与switch不同,其每个分支自带了break

          fun main() {
              val trafficLightState = "Red" // This can be "Green", "Yellow", or "Red"
          
              val trafficAction = when {
                  trafficLightState == "Green" -> "Go"
                  trafficLightState == "Yellow" -> "Slow down"
                  trafficLightState == "Red" -> "Stop"
                  else -> "Malfunction"
              }
          
              println(trafficAction)
              // Stop
          }
          
          // 另外还有经典用法
          fun main() {
              for (number in 1..100) {
                  println(
                      when {
                          number % 15 == 0 -> "fizzbuzz"
                          number % 3 == 0 -> "fizz"
                          number % 5 == 0 -> "buzz"
                          else -> "$number"
                      }
                  )
              }
          }
          
    • 循环控制:

      • Ranges
        • 1..4 == 1, 2, 3, 41..<4 == 1, 2, 34 downTo 1 == 4, 3, 2, 11..5 step 2 == 1, 3, 5Char也可以)
      • Loops
        • for(num in 1..5)或者for(cake in cakes)遍历val cakes = listOf("1", "2")
        • whiledo-while
  • 函数:看了那么多main()已经知道了吧【kotlin建议使用驼峰命名】

    • exp如下,factory function概念:可以返回对象的函数

      fum sum(x: Int, y: Int): Int {
          return x + y
      }
      
    • 参数注意事项:

      • 函数参数传入顺序:

        fun printMessageWithPrefix(message: String, prefix: String) {
            println("[$prefix] $message")
        }
        
        fun main() {
            // Uses named arguments with swapped parameter order
            printMessageWithPrefix(prefix = "Log", message = "Hello")
            // [Log] Hello // 这就意味着可以像python一样指定传入顺序
        }
        
      • 默认参数:命名时可以指定函数参数值fun printMessageWithPrefix(message: String, prefix: String = "Info")(C++那样的操作)

      • Unit函数:不返回函数参数值,可以省去返回值类型的声明

      • 单表达式函数:可fun sum(x: Int, y: Int) = x + y来声明(除了Unit类型)

    • lambda表达式:我觉得每个人都恨这个 Functions | Kotlin Documentation,官方以下几种:

      • 作为另一个函数的参数执行lambda表达式:val fun = { text: String -> text.uppercase() },将text内容大写

        • 进行筛选(单参数甚至无需声明类型):val positives = numbers.filter ({ x -> x > 0 })
        • 必须定义参数类型或仅有一种类型
      • 返回一个lambda表达式:这里使用了map遍历数组作为函数参数

        val numbers = listOf(1, -2, 3, -4, 5, -6)
        val doubled = numbers.map { x -> x * 2 }
        
        val isTripled = { x: Int -> x * 3 }
        val tripled = numbers.map(isTripled)
        
        println(doubled)
        // [2, -4, 6, -8, 10, -12]
        println(tripled)
        // [3, -6, 9, -12, 15, -18]
        
      • lambda表达式嵌套:

        val numbers = listOf(1, -2, 3, -4, 5, -6)
        val doubled = numbers.map { x -> x * 2 }
        
        val isTripled = { x: Int -> x * 3 }
        val tripled = numbers.map(isTripled)
        
        println(doubled)
        // [2, -4, 6, -8, 10, -12]
        println(tripled)
        // [3, -6, 9, -12, 15, -18]
        
        • 假如说嵌套的lambda函数不返回值,那也要() -> Unit

        • 还有继承另一函数分支的用法:

          fun toSeconds(time: String): (Int) -> Int = when (time) {
              "hour" -> { value -> value * 60 * 60 }
              "minute" -> { value -> value * 60 }
              "second" -> { value -> value }
              else -> { value -> value }
          }
          
          fun main() {
              val timesInMinutes = listOf(2, 10, 15, 1)
              val min2sec = toSeconds("minute")
              val totalTimeInSeconds = timesInMinutes.map(min2sec).sum()
              println("Total time is $totalTimeInSeconds secs")
              // Total time is 1680 secs
          }
          
        • 立即执行:在{}后添加()进行立即调用

          println({ text: String -> text.uppercase() }("hello"))
          // HELLO
          
        • Trailing lambda不懂

  • class

    • 定义类:class User(val name: String, var id: Int)
      • 当属性不使用valvar声明时,其不可被访问
      • 对象实例化:val contact = Contact(1, "mary@gmail.com")
      • 属性访问使用.
      • 成员函数
    • 数据类data class User(val name: String, val id: Int)
      • 预定义函数toString(), equals() or ==, copy()
        • println(User)=>User(name=Alex, id=1)
  • Null安全:Null safety | Kotlin Documentation,大致就是说这个语言实际上为空值安排了内存空间(不会出现到处跑的局面)

    • Nullable types:可以赋值为null的变量var nullable: String? = "You"声明

    • 安全调用:基于Nullable类型基础上,将可能为null都标上?

    • Elvis operator(?:):可以使用这个操作符比较是否为null

      fun main() {
          val nullString: String? = null
          println(nullString?.length ?: 0)
          // 0
      }
      
    • 更多乱七八糟NULL...

posted @ 2025-04-16 04:44  L`Lawliet  阅读(20)  评论(0)    收藏  举报