Kotlin版本的WanAndroid项目实战(一):Kotlin基础语法(与Java不同的地方)

Kotlin在今年5月份获得了Android官方的支持,被指定为Android开发一级语言,一个月之内进入了编程语言排行榜的前50(。而Android Studio也有插件支持Kotlin,Kotlin可以和Java混合使用,AS中支持直接将Java和Kotlin代码互相转换,相对来讲Kotlin代码比Java简洁一些

变量、常量、方法

Kotlin 的基本数值类型包括 Byte、Short、Int、Long、Float、Double 等,注意哦!这里是Int不是Integer,而且字符在Kotlin中属于一个特殊的数据类型。在Kotlin中声明变量的方式和Java也有一定的差别如下

Kotlin定义常量和变量

var name: String = "李四"//变量,可以多次赋值
val age: Int = 24//常量
val sex="男"//支持类型自动检测

在Kotlin中变量和常量通过var和val区分,而且Kotlin没有分号的,没有分号的,没有分号的,(真不是在凑字数...),上面说到变量name不可为空,因为Kotlin中变量可空需要在后面加?

 var name: String ? = "李四"//

这也就是Kotlin中防止空指针的方法,?的作用类似Java中的装箱吧(不明白装箱的自行解决)。

Kotlin中定义方法(静态方法)

fun test(a: Int): Unit {
//方法用fun修饰,括号中内容为参数类型,多个参数用逗号隔开,Unit为参数类型 类似void 可以省略
}

//Kotlin中静态方法采用companion包裹
companion object {

        fun getName() {

        }

        fun getStatic(string: String): String? {
            return null
        }
    }

Kotlin中定义类(静态类)

Kotlin中类的定义和Java差不多,不过从上面定义静态方法应该知道Kotlin中有关静态的定义和Java也是有差异的,Kotlin中静态类定义如下

object Demo {
    ......
//在Kotlin中静态类中的所有方法均为静态方法,而在其他类中调用静态类中的方法不能直接通过
//`类名.方法名()`调用,调用格式如下  `类名.INSTANCE.方法名()`

}

数据之间的比较

在Kotlin中通过==来判断值是否相等,通过===判断内存地址是否相等,下面走进第一个坑...

方法一
fun office() {
    val a: Int = 10000//127
    val boxedA: Int = a
    val anotherBoxedA: Int = a
    Log.e(Tag, (boxedA === anotherBoxedA).toString())//true
    Log.e(Tag, (boxedA==anotherBoxedA).toString())//true
}

这里定义了3个常量,且这3个常量不可为空,(就好比int类型不可以为空),boxedAanotherBoxedA值与内存地址均相等说明这2个变量是对同一个内存地址的引用


方法二
fun office() {
    val a: Int? = 10000//127
    val boxedA: Int? = a
    val anotherBoxedA: Int? = a
    Log.e(Tag, (boxedA === anotherBoxedA).toString())//true
    Log.e(Tag, (boxedA == anotherBoxedA).toString())//true
}

这里定义了3个可为空的常量(Integer对象可以为空这个能理解吧),boxedAanotherBoxedA值与内存地址均相等说明这2个变量是对同一个内存地址的引用,


方法三
fun office() {
    val a: Int = 10000//127
    val boxedA: Int? = a
    val anotherBoxedA: Int? = a
    Log.e(Tag, (boxedA === anotherBoxedA).toString())//-128-127为true其余为false
    Log.e(Tag, (boxedA == anotherBoxedA).toString())//true
}

这里一开始我是不明白的boxedAanotherBoxedA的内存地址是否相等根据a的值来确定,查了一下比较合理的解释就是JVM把[-128,127]的所有int数字全部缓存了,任何指向这个范围的对象,都不可能被另外"创建",自然不能“装箱”

官方文档是不太合理的,它只给了1000这个数。

数据之间的转换

Kotlin中不能像Java一样将一个小的数据类型赋值给大的数据,精度也一样

val b: Byte = 1 // Kotlin中数据类型支持自动检测哦
val i: Int = b // 错误
val z:Int=b.toInt()//正确

val c : Float = 1.123F
val d: Double = c//错误
val d: Double = c.toDouble()//正确


字符串操作

Kotlin中字符串的操作处理得还是很好的不用断断续续的去用加号和双引号连接,$表示一个变量或者变量值

fun stringStitch(){
    val mils = 100
    val sentenceOne = "if you miss the train i on"

    //字符串和其他类型的的数据加$号直接拼接 $mils表示常量的值而非一个字符串  
    val sentenceTwo = "hundred mils or $mils mils"
    Log.e(Tag, sentenceTwo)//打印hundred mils or 100 mils

    //replace直接查找替换字符串中对应的内容
    sentenceOne.replace("train", "bus")
    Log.e(Tag, sentenceOne)//打印if you miss the train i on

    //额  算是多段拼接吧  字符串中的表达式通过${...}表示
    Log.e(Tag, "sentenceOne is $sentenceOne ,but now sentenceOne is ${sentenceOne.replace("train", "bus")}")
    //打印sentenceOne is if you miss the train i on ,but now sentenceOne is if you miss the bus i on
}

区间

和Java不同,Kotlin中舍弃了Java中for(变量初始化;循环条件;迭代语句)的结构,所以在这里先说一下区间的表示方式,Kotlin中可以用a..b表示某一个升序的区间,如果需要表示一个降序的区间采用a downTo b,此外Kotlin中区间中的数据还支持指定步长 a..b step,区间的开闭采用util表示

fun range() {
    for (key in 1..9) {
        //打印1-9
    }
    for (key in 1..9 step 3) {
        //打印1-4-7 步长为3
    }
    for (key in 1 until 9) {
        //依然表示区间,包含开头不包含结尾,一个左闭右开的区间
    }
    for (key in 9 downTo 1) {
        //Kotlin默认只支持升序
    }
}

数组

数组的创建方式包括以下两种,前面讲过Kotlin中不支持数据类型的直接转换,所以在Kotlin中数组是不可型变的,

fun aboutArray() {
    val arrayA: Array<Int> = arrayOf(1, 2, 3)//[1,2,3]
    val arrayB = Array(3, { i -> (i + 10) * 2 })//params_one->数组长度 params_two->表达式{}为空则数组为空 默认i为0
    for (key in 0 until arrayB.size) {
        Log.e(Tag, arrayB[key].toString())
    }
    arrayA.distinct()//数组去重
    var toSet:Set<Int> = arrayA.toSet()//数组去重,并分会set集合
}

第一种val arrayA: Array<Int> = arrayOf(1, 2, 3)长度固定不可数据类型不可变
第二种val arrayB = Array(3, { i -> (i + 10) * 2 })Array中的两个参数分别说明以下,3表示数组的长度,第二个参数{ i -> (i + 10) * 2 },主要在于理解后半部分,这里i的值从0开始按照(i + 10) * 2的方式变化,每次i的值自增1,则数组中类容为[20,22,24]。

条件语句

这个暂时好像没什么好说的,只需要注意一点Kotlin中if语句可以作为表达式来使用比如下面的示例,var value = if (a!! > b) a else b,以及区间在if语句中的运用

fun aboutTrinityOperator() {
    //int c = 1 > 2 ? 1 : 2;  //Java中三目运算符
    @Suppress("CanBeVal")
    var a: Int? = 1
    val b = 2
    //补充一下前面没有写到的一个内容 Kotlin中将一个对象转换为数据类型使用 !! 抛出空指针(),类似Java中出箱
    var value = if (a!! > b) a else b
    //Java中写法
    if (a >= 10 || a <= 20) {

    }
    //结合区间的写法
    if (a in 10..20) {

    }
}

循环语句

这个比较尴尬 Kotlin中废除了Java中for(初始值;条件;变化趋势)的规则,增加一些如下关键字

  • downTo 递减
  • step 步长 默认步长为1
  • until 左闭右开
  • 等等...

总的来说感觉for循环在Kotlin中没有Java中好用了,不过 while循环可以代替for循环具体用法往下看吧

fun aboutFor() {
    var arrayA: Array<Int> = arrayOf(1, 2, 3, 4, 5)
    var arrayB: Array<String> = arrayOf("a", "b", "c")

    //直接遍历所有元素
    for (item in arrayA) {
        //打印arrayA中所有元素
    }

    //遍历区间1-98  步长为3
    for (item in 1 until 99 step 3) {
        //打印 1 4 7 10 步长为3 类似 for(...;...;i=i+3){}
    }
    //遍历区间递减
    for (item in 99 downTo 1 step 2) {
        //打印99-97-95....
    }
    for (item in 10 until 1) {//无法执行  util仅仅支持升序
        Log.e(Tag, item.toString())
    }

    //根据数据的下标进行遍历
    for ((index, value) in arrayB.withIndex()) {
        Log.e(Tag, "the element at $index is $value")//0-3
    //打印内容如下:the element at 0 is a
    //the element at 1 is b
    //the element at 2 is c
    }

}

感觉就是foreach循环的强化版...有木有?,while和do..while循环的话差不多就不写了,上面主要是语法上的一些不同,第一次在简书上发,好紧张...

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容