Kotlin系列--Kotlin不思议,突然的想念你

Google在2017的IO大会上宣布将Kotlin作为Android开发的官方语言。这一重磅消息,以春风又绿江南岸之势,迅速夺取了大多数Android开发人员的眼球。那么就让我们以热烈的歌声欢迎已经七岁的Kotlin登场(鼓掌)。

Kotlin不思议
突然地想念你
彩绘玻璃前的身影
只有孤单变浓郁
Kotlin不思议
突然那么想念你
我带着爱抒情的远行

--《马德里》(有删改)

image.png

老规矩,先奉上Kotlin官方网站中文网站,以备查阅。其余的资料汇总,会在文章末尾附送,资料之多,乱花渐欲迷人眼。由于是初次接触Kotlin,错误再所难免,欢迎留言指正批评。

一:Kotlin基本语法

1:定义函数
(1):这里定义了一个两个整数之间的乘法的函数,Int注意首字母要大写,而且在返回值对应的类型,应该写在大括号的前面,而不是紧跟fun之后。

fun mul(a:Int,b:Int):Int{
    return a*b;
 }

(2):上面只是一种写法,还有另外一种返回值类型自动推断的用法

fun mul(a:Int,b:Int)=a*b

(3):当我们不需要函数返回值时,可以用Unit

fun mul(a:Int,b:Int):Unit{
    println("kotlin绵绵无期")
}

(4) :Unit 还可以省略,于是就出现了这种和自动推动有些像的写法

fun mul(a:Int,b:Int) {
    println("长恨kotlin非我有")
}

2:定义局部变量
(1):下面这种定义的属于常量,只读,不可以修改,使用了关键字val。

val kot:Int = 5  //立即赋值
val lin=2   // 推断赋值
val love:Int  // 如果没有明确赋值,那么类型就不可以省略
love=520 // 然后再单独给她赋值

(2):下面这种定义属于变量,使用关键字var

var  you =5 //自动推断出类型
you+=520

3:字符串模版

var love=520
val temp1="love is $love"

love=525
var temp2="${temp1.replace("is","was")},but now is $love"

上面的这段代码temp2这个字符串实际上就是"love was 520,but now is 525".这里的love被赋值了两次,第一次是520,第二次是525.

4:三元操作符没有,可以用if取代

val temp = if(args.size==0) "english" else args[0]

不仅变量可以赋值,就连方法也可以,但是这种算不算给方法赋值呢?

fun min(a:Int,b:Int)= if(a>b) b else a

5:for循环

var args=listOf("han","tang","song")
//args 是数组,下面分三种方式打印数组中的name元素
for(name in args){
    println("hello,${name}")
    println("hello,$name")
    println("hello,"+name)
} 
println("hello,$args[0]")
println("hello,${args[0]}")

for(index in args.indices){
      println("name at $index is ${args[index]}")
}
var temp=args.size
while (temp>0){
        println("name at ${temp-1} is ${args[temp-1]}")
        temp--
}

可是为什么"hello ,{args[0]}"就正常,但是"hello,args[0]"就无法打印出数组的第一个元素,而是打印了数组的地址呢?

6:null 检查
最让人们称道Kotlin之一的就是null check了吧,如果不做null检查,就会报错。当某个变量允许为null时,必须在声明的类型后面添加一个?。

fun parseInt(temp:String ):Int?{
    try{
        return temp.toInt()
    }catch(e:NumberFormatException){
        println("here is a argument isnt Int")
    }
    return null
}

7:is用来做类型判断
当用is类型判断之后,可以直接使用该变量,而不再需要强制转换。

if(name is String){
    val tempLength=name.length
}
//或者
if(name !is String){
      return null
}else{
    return name.length
}

8:when取代了switch

fun describe(obj: Any): String =
when (obj) {
    1          -> "One"
    "Hello"    -> "Greeting"
    is Long    -> "Long"
    !is String -> "Not a string"
    else       -> "Unknown"
}

fun main(args: Array<String>) {
    println(describe(1))
    println(describe("Hello"))
    println(describe(1000L))
    println(describe(2))
    println(describe("other"))
}

9:String字符串和 Array数组都有length 属性可以查看长度。

if(name is String){
    val tempLength=name.length
}

**10 官方的一个例子,比较难理解 **
(1)怎么在main方法里面,还可以定一个方法?
(2) println("'obj' string length is{getStringLength(obj) ?: "... err, not a string"} ")这句话怎么理解?

fun getStringLength(obj: Any): Int? {
    if (obj is String) {
        // `obj` 在该条件分支内自动转换成 `String`
        return obj.length
    }

    // 在离开类型检测分支后,`obj` 仍然是 `Any` 类型
    return null
}


fun main(args: Array<String>) {
    fun printLength(obj: Any) {
        println("'$obj' string length is ${getStringLength(obj) ?: "... err, not a string"} ")
    }
    printLength("Incomprehensibilities")
    printLength(1000)

11:区间迭代
使用 in 运算符来检测某个数字是否在指定区间内:

fun main(args: Array<String>) {
    for (x in 1..10 step 2) {
        print(x)
    }
    for (x in 9 downTo 0 step 3) {
        print(x)
    }
}
// 135799630


fun main(args: Array<String>) {
    val list = listOf("a", "b", "c")

    if (-1 !in 0..list.lastIndex) {
        println("-1 is out of range")
    }
    if (list.size !in list.indices) {
        println("list size is out of valid list indices range too")
    }
}
//-1 is out of range
//list size is out of valid list indices range too

12:使用集合

fun main(args: Array<String>) {
    val items = setOf("apple", "banana", "kiwi")
    when {
        "orange" in items -> println("juicy")
        "apple" in items -> println("apple is fine too")
    }
}
//apple is fine too


fun main(args: Array<String>) {
    val fruits = listOf("banana", "avocado", "apple", "kiwi")
    fruits
    .filter { it.startsWith("a") }
    .sortedBy { it }
    .map { it.toUpperCase() }
    .forEach { println(it) }
}
//APPLE
//AVOCADO

二:Kotlin在Android中的使用。

Kotlin基础的学习与Android开发的两相结合,我感觉效率会快点,所以呢,下面就试一下Kotlin在Android中的应用。由于我的Android studio目前版本是稳定版2.3 ,而官方的需要3.0才能支持Kotlin的使用,但是我们可以在版本2.3上通过插件的形式,来率先感受一下。下面是安装插件的过程,系统环境是Mac os,工作环境是Android studio 2.3。


image.png

当我们选中来Kotlin之后,就可以点击右边的Install绿色按钮进行安装,安装可能会需要0到正无穷大的时间,关键还是看网速,正常取值范围应该在1到10分钟之间吧。安装成功之后,就可以重启Android Studio。

image.png

重启完成之后,就可以点击项目包,开始创建Kotlin语言的的Activity了。


image.png

当我们创建了一个KotlinActivity,那么这个项目,就不再是普通的Android项目了,而是一个拥有Kotlin的被称作官方语言的项目了。此时我们会在新建的KotlinActivity上面发现一个提示,要求我们配置Kotlin。


image.png

当我们点击Configure配置完成Kotlin之后,就sync project同步一下项目。此时就会出现**Refreshing projectName Gradle Project **,那么我们就可以起来活动一下,倒杯水,看看窗外风景,慢慢等待。。

花开花落,春去秋来

gradle终于更新完成。此时可以一睹KotlinActivity的芳容了。

class Main2Activity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main2)
    }
}

那么到底都是什么地方出现了变化了呢?AndroidMenifest.xml一切正常。activity_main2.xml一切正常。App的build.gradle文件中似乎发生了一些变化

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
……
compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"

在project的build.gradle中也发生了一些变化

buildscript {
    ext.kotlin_version = '1.1.2-3'
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.2'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

系统提示编译版本和IDE自带的kotlin_version不一致,于是就手动改了版本号1.1.2-4改成了1.1.2-3。然后gradle又开始下载了。。。

花谢花开,秋去春来

gradle更新完成之后,我们就可以在KotlinActivity中尝试写一下代码了。

附录

Kotlin学习资料大全,附送学习视频首发
一文让你全面深入了解Kotlin,附优秀的开源Kotlin的Android项目和视频

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

推荐阅读更多精彩内容