一、入门Kotlin

kotlin基础入门,与java对比

学习kotlin最主要的知识点包含变量、函数(实际就是方法)、逻辑控制语句、面向对象编程、Lambda编程、空指针检查机制等

变量

java中如果想要声明一个变量,需要在其前面声明这个变量的类型
kotlin 只有两个字段声明一个变量 valvar

    val a: Int = 10;
    val b = 20L
    var e = "123123123"

区别:
val对应java中的final,常量,初始赋值后不能再被赋值
var用来声明一个可变的变量,可以重复被赋值
使用方式:优先使用val去声明一个变量,而当val不能满足需求的时候,在使用var,这样的程序会更加健壮

java和Kotlin数据类型对照表

java基本数据类型Kotlin对象数据类型
intInt
longLong
shortShort
floatFloat
doubleDouble
booleanBoolean
charChar
byteByte

函数(方法)

使用fun声明,后面跟函数名,例如:

fun main() {    //main方法
}
//声明一个方法
fun printParmas(i: Int ,str : String = "hello") {
    println("int is $i , str is : $str")
}

逻辑语句

1、if条件语句
java的if判断

  private static int max(int i, int j) {
        int k ;
        if (i>j){
            k = i;
        }else {
            k = j;
        }
        return k ;
    }

Kotlin的if判断

//正常
fun maxNun(a: Int, b: Int): Int {
    var c = 0
    if (a>b){
        c= a
    }else{
        c = b
    }
    return c
}

//简化
fun maxNun(a: Int, b: Int): Int {
    var c = if (a>b){
        a
    }else{
        b
    }
    return c;
}
//精简
fun maxNun(a: Int, b: Int): Int = if (a > b){
   a
}else{
    b
}
//最终版
fun maxNun(a: Int, b: Int): Int = if (a > b) a else b

2、when语句判断
类似java中swich语句,比swich强大,可以传入几乎是任意类型做判断

fun getStore(s: String) : Int = when(s){
    "sdd"->70
    "we"->712
    "qweq"->7023
    else -> 0;
}

when语句允许传入一个任意类型的参数,格式:匹配值 -> {执行逻辑},如

fun checkNumber(i: Number) {
    when(i){
        is Int -> println("是 int")
        is Double -> println("是 double")
        else -> println("是 m没有")
    }
}

3、循环语句
java中常用循环有while循环和for循环,kotlin也一样,这两种循环都有

		java中循环
        for (int l = 0; l < 1; l++) {
        }
        while (true){
        }
        for (String s: name){
        }

kotlin中循环

	//定义一个0-10的数
    val range = 0..10;  
    //定义一个0-10的数,筛选出3的倍数
    val ranges = 0 until 10 step 3;
    for (i in ranges ){
        println("是  $i")
    }
	//倒序输出从10到4
    for (i in 10 downTo 4){
        println("是  $i")
    }
     while (true){
   }

…和until 区别:
: 创建两端闭区间的关键字
until :创建一个左闭右开的区间
step :跳过一些其中的元素

面向对象

1、类与对象
创建一个对象,java需要声明其参数类型,get 和 set方法,kotlin 不需要,只需要声明对象,设置默认值就可以了。

class Persion {
    var name = "";
    var  age = 0;

    fun eat(){
        println(name +"is eat" + age +"yaer old");
    }
}
//使用
    val  p = Persion();
    p.name = "Tom"
    p.age = 200;
    p.eat()

2、继承
java中继承是需要父类抽象类,才能去实现继承,kotlin中也是,所有非抽象类都不可被继承,如果需要被继承,需要在父类声明open关键字,子类继承父类,只需要在末尾添加 :父类名,就实现继承了

 open class Persion {
    var name = "";
    var  age = 0;
}
 class Student() : Persion() {
    var num = "";
    var  store = 0;
    }
    //默认初始化赋值
 class Student(var  sno : String , var grade:Int) : Persion() {
    var num = "";
    var  store = 0;
    //次构造函数
	 constructor(): this("",0){

    }
    init {
        println(sno);
        println(grade);
    }
 }

constructor:次要构造函数定义关键字
init:数据结构打印关键字,类似于java的toString

3、接口
kotlin和java接口声明类似,都是用interface修饰类名的,和java一样,可以单继承,多实现
使用方式和继承一样,也是 : 接口类名

interface Study {
    fun resdBook()
    fun doHomework(){
        println("And is  doHomework")
    }
}
//和继承的区别是,继承后面有括号,接口没有
 class Student(var  sno : String , var grade:Int) : Persion() ,Study{}

4、多态
kotlin也可以使用多态

    val s = Student("123",1)
    s.name = "jery"
    s.age = 10000000
    doStudys(s);
    //多态
	fun doStudys(study: Study) {
	    study.resdBook()
	    study.doHomework()
	}

5、修饰符
java中的修饰符 public private protected default 默认是default
kotlin的修饰符 public private protected internal 默认是public

修饰符javaKotlin
public所有类可见所有类可见(默认)
private当前类可见私有当前类可见私有
protected当前类,子类,同一包路径下的类可见当前类子类可见
default同一包路径下的类可见(默认)
internal同一模块中的类可见

6、数据类和单例类
在java中,需要做数据排序等操作,通常需要重写equals、toString、hashcode这几个方法:例如

public class CellPhones {
    String brand;
    double price;

    public CellPhones(String brand,double price){
        this.brand = brand;
        this.price = price;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        CellPhones that = (CellPhones) o;
        return Double.compare(that.price, price) == 0;
    }

    @Override
    public int hashCode() {
        return Objects.hash(price);
    }

    @Override
    public String toString() {
        return "CellPhones{" +
                "brand='" + brand + '\'' +
                ", price=" + price +
                '}';
    }
}

Konlin中使用数据类模型排序,在数据类前面用data关键字修饰,kotlin会自动生成equals,hashcode,toString 等方法,实现比较大小等功能

data class CellPhone(val Brand:String,val price : Double)

    val phone1 = CellPhone("sanxing",21220.10)
    val phone2 = CellPhone("sanxing",21220.10)
    //创建java数据模型
    val phone3 = CellPhones("sanxing",21220.10)
    val phone4 = CellPhones("sanxing",21220.10)
    println(phone1)	//CellPhone(Brand=sanxing, price=21220.1)
    println(phone1==phone2)	//true
    println(phone3)  //CellPhone(Brand=sanxing, price=21220.1)
    println(phone3==phone4)  //true
    

单例模式:避免创建重复对象
java中常用的单例类一般就是懒汉和饿汉两种,使用synchronized加锁,避免重复创建对象,必要时双重锁定

public class SingleTonjava {
    private  static  SingleTonjava singleTonjava;
    public SingleTonjava(){ }
    public synchronized static SingleTonjava getInstance(){
        if (singleTonjava== null){
            singleTonjava = new SingleTonjava();
        }
        return singleTonjava;
    }
}

Kotlin中单例类直接创建就可以,创建Kotlin.class文件的时候,选择Object.创建的类就是单例类

object Singleton {
    fun SingletonTest(){
        println("SingletonTest  单例模式")
    }
}
	//调用
 Singleton.SingletonTest()

Lambad编程

1、集合
kotlin集合包含List集合和Set集合、Map集合
List—ArrayList LinklistList
Set—HashSet
Map—HashMap

list集合创建
listOf函数创建的是一个不可变的集合,长度是固定的
mutableListOf函数创建的是一个可变的集合,可以往里面添加元素

	//传统创建集合方式,和java类似
    val list  = ArrayList<String>()
    list.add("apple1")
    list.add("apple2")
    list.add("apple3")
    list.add("apple4")
    println(list)

    //创建的是不可变集合
    val list1 = listOf<String>("apple1","apple1","apple1","apple1")
    println(list1)

    //创建可变集合
    val list2 = mutableListOf<String>("app","apple1","apple1","apple1")
    list2.add("123s123d")
    println(list2)

set集合
底层是有hash映射机制来存放数据的,因此,集合中的数据是无序的,去除重复元素
setOf函数创建的是一个不可变的集合,长度是固定的
mutableSetOf函数创建的是一个可变的集合,可以往里面添加元素

 //set集合和list用法一样
    val set  = HashSet<String>()
    set.add("apple1")
    set.add("apple2")
    set.add("apple3")
    set.add("apple4")
    println(set)   .//[apple1, apple2, apple3, apple4]

    //set集合值思唯一的,自动去重
    //创建的是不可变集合
    val set1 = setOf<String>("apple1","apple1","apple1","apple1")
    println(set1) //[apple1]

    //创建可变集合
    val set2 = mutableSetOf<String>("apple1","apple1","apple1","apple1")
    set2.add("123sd")
    println(set2)	//[apple1, 123sd]

Map集合
map集合是键值对形式的数据结构,key唯一,值不唯一,key相同,以后添加的key的value值为准,map集合不建议使用put和get方法添加和获取数据,推荐使用map[kay] = value这种形式,添加数据
mapOf函数创建的是一个不可变的集合,长度是固定的
mutableMapOf函数创建的是一个可变的集合,可以往里面添加元素

val map = HashMap<String,Int>()
    //这种写法不建议
    map.put("apple1",1)
    map.put("apple2",2)
    map.put("apple3",3)
    //建议这种写法
    map["apple3"] = 4
    map["apple5"] = 5
    println(map)		//{apple1=1, apple2=2, apple3=4, apple5=5}
    //获取一条数据
    val  number = map["apple4"]
    println(number)	//null

    //创建map集合简单写法
    //长度不可变
    val map1 = mapOf<String,Int>("apple1" to 1,"apple2" to 2,"apple3" to 4,"apple4" to 4)
    //长度可变
    val map2 = mutableMapOf<String,Int>("apple1" to 1,"apple2" to 2,"apple3" to 4,"apple4" to 4)
    map2["apple5"]=5
    println(map1)	//{apple1=1, apple2=2, apple3=4, apple4=4}
    println(map2)	//{apple1=1, apple2=2, apple3=4, apple4=4, apple5=5}

map集合循环遍历数据

   for ((key , value) in map){
        println("ket is $key  , value is $value")
    }

2、集合的函数API
//如果两个元素比较大小,可以调用MathJVM.kt中的比较方法就可以实现,例如:

fun maxNunOne(a: Int, b: Int): Int = max(a, b)
fun methonName(i: Int, i1: Int): Int {
    return min(i, i1);
}

集合中找最大值,传统写法就是遍历集合,找到其中的最大值

  var maxLearthFruit = "";
    for (fount in list2){
        if (fount.length > maxLearthFruit.length){
            maxLearthFruit = fount;
        }
    }

Kotlin的API有直接取最大值的方法(相关方法在Collection.kt这个类中)

//简写 lambda写法
	var maxLearthFruit1 = list2.maxByOrNull { it.length }   //最大值
	val minNum = list2.minByOrNull { it.length }		//最小值
//正常写法
	var lambda = {list : String -> list.length};
	var max = list.maxByOrNull(lambda);

筛选函数filter :用来过滤集合中的数据,可以单独使用,也可以配合map一起使用

//筛选长度为6以下的元素,并且这些元素都大写
val list = listOf<String>("apple1","apple2","apple3","apple4","121312")
  val newList = list.filter { it.length<=6 }.map { it.toUpperCase() }
 // [APPLE1, APPLE2, APPLE3, APPLE4]

any 和 all函数
any至少有一个元素满足条件就行
all是所以元素都必须满足条件

	    val list2 = mutableListOf<String>("app","apple1","apple1","apple1")
	    val  anyResult = list2.any { it.length<= 5 }
	    val  allResult = list2.all { it.length<= 5 }
	    println(anyResult)  //true
	    println(allResult)	//false

Kotlin调用java函数API
开启线程:

	//常规写法
   Thread(Runnable {
        println("Thread is run")
    }).start()

    //省略写法
    Thread{
        println("Thread is run two")
    }.start()

空指针

?. :判空符,可以判断元素空的操作

 doStudy(null);
 fun doStudy(s: Study?) {
    //直接盘空
    if (s != null){
        s.resdBook()
    }
    // ?.操作符
    s?.doHomework()
}

?: :操作符 类似于三元运算符,做判空操作用的

//一般判空操作
var c = if (a!= null){
        a
    }else{
        b
    }

    //简化
    val  d = a ?: b;

let函数
let函数属于Kotlin中的标准函数,let函数是处理全局变量的判空问题的,而if.判断语句是无法做到这点的

//let相当于整体判断
 doStudy1(null);
 fun doStudy1(s: Study?) {
    s?.let { stu ->
        stu.resdBook()
        stu.doHomework()
    }

    //简化
    s?.let {
        it.resdBook()
        it.doHomework()
    }
}

可空类型系统
kotlin中默认所有的参数和变量都不为空,所以传入的任何参数都不为空,如果一个函数传入一个null,会有报错,提示在函数方法声明类型后面添加**?**

字符串内嵌表达式
$ 操作符:可以直接把变量放在打印字符串里输出,不用频繁的拼接字符串了

 println("int is $i , str is : $str")

函数的参数默认值
函数初始化的时候,可以设置参数默认值

printParmas(123);
fun printParmas(i: Int ,str : String = "hello") {
    println("int is $i , str is : $str")
    //int is 123 , str is : hello
}

参考郭霖老师的第一行代码(第三版),第二章,做的笔记,有兴趣可以查看书籍

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值