搜索
您的当前位置:首页正文

Kotlin学习笔记之 2

来源:哗拓教育

2.

  • 分割数字

    为了更直观,可以在数字上用_来进行截取(这个kotlin和java都OK,只是现在才发现而已)

    比如中国人比较喜欢 1_0000_0000 表示一个亿 外国人比较喜欢 1_000_000 1 million

    同样的 0xEF_10_CC 分割十六进制等

  • 基本数据类型还是封装数据类型

    大家都会有个误解,说kotlin只有Int没有Integer,是kotlin放弃了封装类型,只剩下了基本类型。

    此处千万不要误解,只不过是名字叫Int,但实际上他依然是封装类型,为了防止出现空的情况。 在Primitives.kt文件中

     /**
     * Represents a 32-bit signed integer.
     * On the JVM, non-nullable values of this type are represented as values of the primitive type `int`.
     */
    public class Int private constructor() : Number(), Comparable<Int> {
    

    我们看到,所描述的是表示一个32位的整型,在JVM中,对于非空的情况下等同于基本类型int

    既然是封装的,就会有对象相等和数字相等

    === 代表地址 ==代表值

  • kotlin中去掉了java中的位运算符

    shl ====== << 左移

    shr ====== >> 右移

    ushr ======= >>> 无符号右移

    and =====&` 与

    or ===== |

    xor ===== ^ 异或

    inv ===== ~

  • java中你可以写 char a = 1; 但是在kotlin中char必须要有'',否则会报错

    var c : Char = 1 会报错

  • 布尔运算符只是针对 Boolean, 如果用的是Boolean? 就会出现报错, 如下

     var b : Boolean?  = true
     var c : Boolean?  = true
    
     //报错
     var d = b && c
     //要么做判空断言抛异常
     var d = b!! && c!!
     //要么做判空额外处理
     var d = b?: true && c?: false
    
  • 数组构造方式

    kotlin的数组构造方式有两种,与java完全不同。

    • 第一种构造

      //arrayOf函数,自带分析属性,你如果传入了1,2,3那么kotlin就会默认将array认为是Int数组
      var array = arrayOf(1,2,3)
      

      我们经过打印之后能够看到,是整型数组 [Ljava.lang.Integer;@a390116

      同样的,另外一个方法arrayListOf(),效果一样的产生arrayList列表,但是arrayList列表通过println方法是可以直接将数据打印出来的

      var array1 = arrayListOf(1,2,3)
      println(array1)
      //打印出来
      System.out: [1, 2, 3]
      

      补充(1)一下我们肯定可以,并且经常直接拿来用的是intArrayOf, xxxArrayOf

      只不过直接使用的intArrayOf返回的是IntArray类型,而arrayOf(1,2,3)Array<Int>,两者不能相互赋值!

      补充(2)kotlin中无论是Array还是List,都可以使用[index]的方式来进行取值

      补充(3)kotlin可以直接通过array.indices来拿到index的迭代

      var list = listOf(1,2,3)
      
       for(i in list.indices){
           println(list[i])
           println(i)
       }
      

      补充(4)甚至可以直接使用array.withIndex()方法直接走key,value的形式

      for((index, value) in newArray.withIndex()){
           print("index is $index, value is $value")
      }
      

      补充(5)array和list以及set等数组列表类型都可以通过相关方法做链式调用

      fruits
         //筛选
         .filter { it.startsWith("a") }
         //排序
         .sortedBy { it }
         //统一处理
         .map { it.toUpperCase() }
         //遍历
         .forEach { println(it) }
      
    • 第二种构造

      使用Array()构造函数。需要传两个参数,一个是size,一个是lambda表达式

      我们写了个例子:

      val e = Array(3, { i -> (i * 2) })
      
      for(i in e){
          println(i)
      }
      

      最终打印出来的结果是0,2,4

      有点懵逼,从结果倒推,感觉是分别做了0 * 2,1 * 2,2 * 2,也就是说i分别代表的是0,1,2三个数

      我们直接打开Array.kt

       /**
        * Represents an array (specifically, a Java array when targeting the JVM platform).
        * Array instances can be created using the [arrayOf], [arrayOfNulls] and [emptyArray]
        * standard library functions.
        * See [Kotlin language documentation](http://kotlinlang.org/docs/reference/basic-types.html#arrays)
        * for more information on arrays.
        */
       public class Array<T> {
           /**
            * Creates a new array with the specified [size], where each element is calculated by calling the specified
            * [init] function. The [init] function returns an array element given its index.
            */
           public inline constructor(size: Int, init: (Int) -> T)
       }
      

      两段比较重要的解释,一个是产生一个specified [size]的array,另一个是returns an array element given its index,重点在index,那就不难理解了,直接lambda的话就是箭头左边的用的index

      同时我们从lambda的表达式,可以看得出来,最终Array<T>中的泛型T的判断来自于表达式的箭头右侧的值

      比如如下:

       //kotlin会判断为  Array<Int>
      val e = Array(3, { i -> (i * 2) })
       //kotlin会判断为  Array<String>
       val f = Array(3, { i -> "$i , hello"})
      

      此处的也可以直接IntArray或者xxxArray来代替让kotlin自己判断的Array

  • 字符串

    三个"可以用来描述多行字符串

    val text = """
     |多行字符串
     |菜鸟教程
     |多行字符串
     |Runoob
     """
    

    由于md没有kotlin格式,所以看起来怪怪的,但是实际上是可以输出多行的。

    trimMargin方法,类似于java中的trim,只是由于kotlin支持了多行的String形式,所以trimMargin不单单要做的是去除空格,还有去掉每一行多余的部分,我们来看源码

    public fun String.trimMargin(marginPrefix: String = "|"): String =
     replaceIndentByMargin("", marginPrefix)
    

    默认的前缀是|,所以所有|之前的内容会被直接干掉。我们也可以自定义前缀字符穿进去,比如 trimMargin(">")

kotlin中,可以用Char来遍历String

for(c in text){
    println(c)
}

字符串模板使用的是"$"的形式,可以直接跟参数名,或者{表达式}

 val i = 10
 val s = "i = $i" // 求值结果为 "i = 10"
 println(s)

需要打出具体字符,比如$的方式为

"${'$'}"
  • 可空boolean

    布尔类型是可空的,此处记住要用== true,而不是我们通常直接将boolean直接放入if判断

    val b: Boolean? = ……
      if (b == true) {
          ……
      } else {
          // `b` 是 false 或者 null
      }
    
  • 无符号数Uxxx

    从kotlin1.3开始,引入了无符号数类型,分别对应的UInt``ULong``UShort``UByte,均只有正数,没有负数。

    对应的也带来了相应的array,UByteArray``UShortArray``UIntArray``ULongArray

Top