美文网首页
Kotlin学习笔记

Kotlin学习笔记

作者: 長得太帥忚四種檌 | 来源:发表于2017-12-04 17:49 被阅读7次
  • 主函数:
fun main(args:Array<String>){
    println("hello")
}
  • 声明变量
  1. var name="gongxm"; 变量的类型在存储数据时由编译器自动判断
  2. var name:String="gongxm"; 声明变量时手动指定数据类型
  3. val name="gongxm";  声明常量,常量只读, 不能修改
  • 函数的定义
fun 函数名(参数名:参数类型):返回值类型{
    方法体
}

例如:
fun add(a:Int,b:Int):Int{
    return a+b;
}

注意: 如果没有返回值, 返回值类型可以写 Unit 也可以省略不写!
  • 模板数据
var temp = " xxxxxxxxxxx ${name} xxxxxxxxxxxxxxx  "

其中${name}就是动态变化的数据
  • 字符串比较
var stra = "aaa";
var strb = "bbb";

stra.equals(strb) 判断两个字符串是否相同,区分大小写
stra==strb   同上, 效果一样
stra.equals(strb,false) 判断两个字符串是否相同,不区分大小写
  • 空值处理
fun print(str:String){  // 该方法不允许传入null
    ....
}

fun print(str:String?){ // 该方法可以传入null
    ....
}
  • when表达式
var result = when(num){
            1 ->"一"
            2 ->"二"
            3 ->"三"
            else ->"other"
            }

  • for循环
var nums = 1..100
var sum = 0
for(num in nums){   //循环执行100次
    sum+=num
}


for(num in nums step 2){//间隔2执行
    ...
}

var renums = nums.reversed()  //反转nums中的内容

var count = nums.count();   //获取nums的个数


  • list的使用
var list = listOf("a","b","c")
for((i,e) in list.withIndex()){
    println("$i $e")
}
  • Map集合
var map = TreeMap<String,String>()
map["good"] = "好"
map["study"] = "学习"

println(map["good"])
  • 函数的特殊写法一:
var add = {x:Int,y:Int->x+y}
var sum = add(10,20)
println(sum)
  • 函数的特殊写法二:
var add:(Int,Int)->Int = {x,y->x+y}
var sum = add(10,20)
println(sum)
  • 默认参数:在声明方法时,可以直接指定该参数的一个默认值
例如,求圆的面积:
fun getArea(PI:Double=3.1415,radius:Double):Double{
        return PI*radius*radius;
}
  • 具名参数:
在调用以上声明的方法时,可以像正常的方法一样调用,传入两个参数
也可以只传入一个参数,因为第一个参数是有默认值的,调用方式:
        var area = getArea(radius=2.0)
        println(area)
必须要指定传入的参数是哪个!
  • 数字和字符串的互转
var a = 10;
var b = "20"
var c = a.toString()   //数字转字符串
var d = b.toInt()       //字符串转数字
  • 键盘录入
var str = readLine()
  • 异常的处理
try{
    可能会发生异常的代码
}catch(e : Exception){
    异常处理代码
}
  • 尾递归优化:强制让递归执行完毕,避免内存溢出
tailrec fun add(num:Long,result:Long):Int{
        println("正在执行第${num}次...")
        if(num==0L){
                println("最后一次执行了,结果是"+result)
                return 1;
        }else{
                return add(num-1,result+num)
        }
}

限制:返回的结果必须是函数本身!不能有其他内容

  • 类的定义:
1.只有属性的类
class Girl(var name:String,var age:Int)
2.有方法的类
class Girl(var name:String,var age:Int){
        fun smail(){
                println("${name}好开心呀")
        }
}
  • 对象的创建
var gf = Girl("林妹妹",23)
  • 继承
open class Father{
        var money = 100
        
        open fun speek(){
                println("会说中国话!")
                println("财富值是:${money}")
        }
}

class Son:Father(){
        
        override fun speek(){
                super.speek()
                println("会说英语!")
        }
}

注意:
1.一个类想被别的类继承, 需要声明为open的
2.一个类中的方法想要给子类重写, 需要声明为open的
3.子类要重写父类中的方法时,需要声明为override的

  • 抽象类
abstract class Person(var name:String){
        fun speek(){
                println("${name}会说中文!")
        }
        
        abstract fun eat()
}

class Student(name:String):Person(name){
        override fun eat(){
                println("${name}吃大餐了!")
        }
}

注意:
子类在声明跟父类中相同的属性时,不需要写var了!

  • 接口
interface USB{
        fun open()
        fun close()
}

class Mouse:USB{
        override fun open(){
                println("打开鼠标")
        }
        
        override fun close(){
                println("关闭鼠标")
        }
}
  • 委托和代理
interface 卖车{
        fun 砍价()
}

class 中间商:卖车{
        override fun 砍价(){
                println("卖了10万块")
        }
}

class 个人:卖车 by 中间商(){
        
}

理解:
一个在实现接口时, 可以直接委托给另一个已经实现了该接口的类, 然后就可以直接使用另一个类中已经实现的方法了

  • 单例模式
object GirlFriend{
        fun eat(){
                println("大吃一顿!")
        }
}
  • 单例的对象调用:
GirlFriend.eat()
  • 枚举的定义
enum class Direction{
        UP,DOWN,LEFT,RIGHT
}
  • 印章类: 控制子类的个数
sealed class Animal{
        fun eat(){
                println("吃饭!")
        }
        
        class Dog:Animal(){
                fun lookHome(){
                        println("看家")
                }
        }
        
        class Cat:Animal(){
                fun catchMouse(){
                        println("抓老鼠")
                }
        }
}

类似于枚举,也类似于抽象类.

  • is关键字
相当于java中的instanceof关键字
而且,判断后会智能转换成该类型,可以直接使用!
   var d:Animal = Animal.Dog()
        d.eat()
        if(d is Animal.Dog){
                d.lookHome() //Dog类中的特有方法
        }
  • 函数式编程
//把一个函数赋值给一个变量
var print = fun(str:String){
        println(str)
}

var list = listOf<String>("tom","josen","kotlin")
        
list.forEach(print)  //把函数变量作为参数传递给forEach方法
        
println("---------")
        
list.forEach{
     str->println(str)  //直接在forEach方法中写一个方法的内容
}
        
println("---------")
        
list.forEach{
     println(it)  //直接在forEach方法中写一个方法的内容, forEach方法中会默认给遍历到的元素自动命名为: it
}
  • list集合中的高级函数
    maxBy{条件}: 根据条件获取集合中符合条件的最大值
    minBy{条件}: 根据条件获取集合中符合条件的最小值
    filter{条件}: 根据条件获取集合中所有符合条件的结果, 返回的是一个集合
    map{ it.name }: 把集合中的元素的name作为元素, 存储到一个新的集合中,返回新list集合
    any{条件}: 判断集合中是否有符合条件的元素, 返回true或者false
    count{条件}: 获取集合中符合条件的元素个数
    find{条件}: 返回集合中第一个符合条件的元素
    groupBy{ it.age } : 集合中的元素根据指定的内容分组, 返回一个Map集合
  • 函数增强: 自定义DSL
var mylist = listOf<String>("a","b","c","d")

fun List<String>.getSize():Int{  //List本身是没有getSize方法的, 
        //可以通过后缀的方式, 给List增加一个getSize方法
        return size   //在这里面, 可以直接调用List中原有的内容
}

遍历打印集合的新方式
mylist.forEach(::println)

中缀表达式
infix fun List<String>.has(value:String):Boolean{
        forEach { if(it==value) return true }
        return false
}

正常的调用:
println(mylist.has("a"))
 
使用了中缀表达式, 可以这样调用: 无需使用点和小括号
println(mylist has "a")

注意:
1.中缀表达式只能用在自定义DSL中, 一般函数无法使用
2.函数必须有且只有一个参数

相关文章

网友评论

      本文标题:Kotlin学习笔记

      本文链接:https://www.haomeiwen.com/subject/bjwxixtx.html