首发于公众号: DSGtalk1989
2.基本数据类型
-
分割数字
为了更直观,可以在数字上用_来进行截取(这个kotlin和java都OK,只是现在才发现而已)
比如中国人比较喜欢
1_0000_0000表示一个亿 外国人比较喜欢1_000_0001 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