【Android学习笔记】kotlin语法学习

知识点

  1. 小技巧
  • 双击shift,输入待查询的类名,一般是以下划线开头的。比如_Arrays.kt
  • kotlin中部分内容是直接引用的java的,比如HashMap等,具体有哪些,可以查看这个类:TypeAliases.kt
  1. 基本数据类型和空指针安全
//1.变量声明
    // var test : Int = 200
    // var test2 = 200

    //2.数值类型:整型  同理Float Double
    // Int Short Long 这三个都是空指针安全的类型 会映射成java的基本数据类型
    //Int? Shor? Long? 可能为空 会映射成java的包装类
    // var testInt : Int = 222 

    //3.不同数值类型的转换
    //3.1 Int 转换成其他的类型
    // var tInt2 : Int = 200
    // var tDouble : Double=tInt2.toDouble()
    // var tFloat=tInt2.toFloat()

//    4. Boolean 类型
//    var tBoolean:Boolean=true
//    println("aaa $tBoolean")
    //5.null安全
//    var str:String="99"
//    var target = str.toIntOrNull()
//    println(target)
    //6.安全调用
//    var b: String? = "aaa"
//    println(b?.length)//返回null
//   6.1 elvis 操作符
//    当我们有一个 r 的可空引用时,我们可以说如果 r 不空则使用它,否则使用使用非空的 x :
//    val l: Int = if (b != null) b.length() else -1
//    val l = b?.length()?: -1
    //7.三目运算符
//    b?.let {  print("let")}
//    var c: Int = b?.length ?: 12    elvis操作符
//    println(c)
//    8.区间运算符
//    var range1: IntRange = 2 .. 10 //闭区间运算符
//    var range1: IntRange = 2 until 10//半开区间运算符
//    println(range1 is IntRange)
//    for (v in range1) {
//        println(v)
//    }
//    range1.forEach { println() }

针对?:运算符的解释:

  1. 数组和集合
    2.1. 数组的遍历
//5.1 数组
    var arr1 = arrayOf("peng", "lei", "gang")
    var arr2 = arrayOfNulls<String>(3)
    var v1: String? = "100"
    var tar = v1?.length ?: -1
    for ((index, value) in arr1.withIndex()) {
        //脚标和值遍历
        println("value2:$value")
    }
    for (item in arr1.indices) { //有序的集合都是可以通过indices来遍历的
        //脚标遍历
        println("value2:${arr1[item]}")

    }
    for(i in 0 until  3) {
        println("value3:${arr1[i]}")
    }

2.2. Set

 //5.2 set
    var set1 = hashSetOf("peng", "lei", "gang") //通过查看typealiases.kt得知,kotlin中的hashset就是java中的,增加了一个别名而已
    //set的遍历
    set1.forEach {
        print("value : $it")
    }
    for (s in set1) {
        print("value : $s")
    }
    for (index in set1.indices) {
        
    }

2.3. list 和map类似
3 函数
3.1 函数的定义

fun 函数名(形参列表)[:返回值] {
    //函数体
}

3.2 变参的函数

fun test2(tt : Int, vararg books: String) {
        var testFun : (Int) -> String //函数类型 (Int) -> String
    }

3.3 函数类型

var testFun : (Int) -> String //函数类型 (Int) -> String

3.4 持有一个函数的引用

 fun test3() {
        fun test2Obj(){}

        val ab: () -> Unit = ::test2Obj  //持有函数的引用
    }

3.5 内联函数

  • 关键字 online
  • 简介:
//内联函数
inline fun map(data : Array<Int>, fn : (Int) -> Int) : Array<Int> {
  xxxx
}
  • 作用:减少函数的开销,比如上述代码,用inline修饰后,实际上只有一个函数,出入的函数会和原来的那个函数合并成一个
  • 缺点:如果入参函数较大并且多次调用,会造成代码量很大

3.6 集合的函数式调用
有过滤,转换,聚合等操作符,类似rx

4 面向对象
4.1 类和对象

//定义类   构造方法没有任何修饰符时,可以省略   如果没有显式的构造方法,系统会自动定义一个。
private class Hello constructor(name:String){

}
//类的修饰符 private,public,internal,final,open,abstract   构造方法的修饰符:private,public,internal,protected,final,open,abstruct.   对于属性,是否使用访问控制符,效果是一样的
//属性的默认值: 定义属性时,或者构造方法中可以给默认值 

fun main(args: Array<String>) {    // 包级可见的函数,接受一个字符串数组作为参数
    println("Hello World!")         // 分号可以省略
    var h:Hello?=Hello("sdfsf")
    h?.say()
    println("Hello World!222")
}

private class Hello (name:String){
    var name="sdsd"
	init{
		this.name=name //init方法是为 Primary Constructor服务的,做一些初始化操作
	}
    fun say(){
        //println("hahhah$name")
        println(name)
    }
}

//或者这样写
fun main(args: Array<String>) {    // 包级可见的函数,接受一个字符串数组作为参数
    println("Hello World!")         // 分号可以省略
    var h:Hello?=Hello("sdfsf")
    h?.say()
    println("Hello World!222")
}

private class Hello (name:String){
    var name=name
    fun say(){
        //println("hahhah$name")
        println(name)
    }
}

//或者这样写
fun main(args: Array<String>) {    // 包级可见的函数,接受一个字符串数组作为参数
    println("Hello World!")         // 分号可以省略
    var h:Hello?=Hello("sdfsf")
    h?.say()
    println("Hello World!222")
}

private class Hello (var name:String){
    fun say(){
        //println("hahhah$name")
        println(name)
    }
}

4.2 方法

//引用类中的方法
var rn:(Dot)->Unit = Dot::run   //方法类型:(Dot)->Unit   

4.3 compontN 方法和结构

//非数据类需要自己去写解构方法

//数据类自动生成结构方法 、equals方法、copy等方法

4.4 导包并制定别名

import java.sql.Data as SData 

5 面向对象

posted @ 2019-03-21 22:31  gregpeng  阅读(729)  评论(0)    收藏  举报