首发于公众号: DSGtalk1989
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) }
arrayOf
的构造函数中有一个reified
关键字,具体可见传送门,有点意思,后面再说 -
第二种构造
使用
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
从kotlin
1.3
开始,引入了无符号数类型,分别对应的UInt``ULong``UShort``UByte
,均只有正数,没有负数。对应的也带来了相应的array,
UByteArray``UShortArray``UIntArray``ULongArray
Kotlin学习笔记之 13 基础操作符run、with、let、also、apply