IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Kotlin -> 正文阅读

[移动开发]Kotlin


看书总是觉得都懂了,实际操作二百五,试着默写出来才是真的懂,就是写写有点累。

Kotlin简单语法

变量

1. 关键字var和val

1.var 和val的区别
var:可以改变的变量
val :第一次赋值后,无法进行更改的变量
注意:当变量赋值的时候,首先选择val进行,如果val不满足要求的情况下才选择var,这样能够使得代码更加健壮。

var a=10
a=20  //正确 变量可变所以可以
val b=20
b=20 //错误 不可变的变量 再次进行赋值操作 

2.不必显式声明变量类型

kotlin 具备强大的推导能力,所以变量的定义的时候无需显示声明。
但是延迟赋值的时候,就需要显示声明了,声明的方法是 变量名后面:加类型
延迟赋值:通常使用了lateinit ,在对象的属性声明的时候不初始化,在用到的时候再初始化。

val a=10 //kotlin 推导得出a是Int类型
val b:Int =10;//显式声明Int类型,并赋值10,这时候不需要进行推导了,但是这里的显式申明可要可不要

3. 变量的类型

如上面例子所示,和java相比,Int 是大写的,这代表Kotlin放弃了基础数据类型,全部选择的是对象数据类型。Int,Long,Short,Float,Double,Boolean,Byte,Char

函数

函数的定义

函数的定义fun关键字+函数名+(参数:变量类型)+:返回值类型+函数体。无返回值时不需要声明返回值类型。

//无返回值
fun saySomething(msg:String){ 
    print(msg)
}
//多参数
fun saySomething(msg:String,name:String){ 
    print(name+"说"+msg)
}

//有返回值
fun saySomething(msg:String):Int{ 
    print(msg)
    return 1
}


语法糖

当函数只有一条语句的时候,直接写在函数的后面用等号连接

//语法糖版本
fun saySomething(msg:String)= print(msg)

流程控制

if

if 语句和大多数的语言里面的if语句相类似,唯一新增了一个就是可以有返回值,返回值是每个条件里面的最后一行

//传统写法
fun largerNumber(num1:Int,num2:Int):Int{
	var max=0;
	if (num1>num2){
	 max= num1 
	} else{
	 max=num2
	}
	return max
}

//新特性的改写
fun largerNumber(num1:Int,num2:Int):Int{
	if (num1>num2){
	  num1 
	} else{
	  num2
	}
}


//语法糖  因为只有一句语句( if和else是整体,结果就是返回一个值) ,套用上面的语法糖所以可以用等号连接
fun largerNumber(num1:Int,num2:Int):Int= if (num1>num2) num1 else num2


//当然既然采用了语法糖用等于号连接,那么也可以省略显式声明,让kotlin自己推导类型
fun largerNumber(num1:Int,num2:Int)= if (num1>num2) num1 else num2

when

类似于switch,但是强于switch,变量不只局限于整形或者是字符串。而且不需要break语句。 【匹配值】->{执行逻辑},当执行逻辑只有一行代码,{}可以省略不写。而且when和if一样也是可以有返回值的,

//传统写法
fun getScore(name:String):Int {
 var score =0
    when(name){
        "Tom"->{ score =66 }  //不省略{}写法
        "ANN"-> score =90 //省略写法
        else -> score =0
    }
    return score 
}

//语法糖写法 when整体是一个语句
fun getScore(name:String)= when(name){
	  "Tom"->66
	   "ANN"-> 90
        else -> 0
}

//不带参数的when写法

fun getScore(name:String)= when(){
	  name=="Tom"->66 // 前面写匹配的条件 
	  name== "ANN"-> 90
        else -> 0
}

for in 循环

Lambda表达式

Lambda是一小段可以作为参数传递的代码片段。什么意思呢,通常写函数的时候,我们定义的参数是Int,String 啊之类的,但是现在写函数的时候我们可以选择传入的参数是一个Lambda的表达式,(也就是一小段代码作为参数)。实不相瞒,个人认为这个东东很像回调函数。

Lambda式子的语法结构,函数体中最后一行代码就是lambda的返回值
{参数名1:参数类型,参数名字:参数类型 -> 函数体}

以一个我写的无病呻吟的一个传入参数是Lambda表达式的函数textLambda为例子。

//参数名为test  然后参数的类型是 一个Lambda表达式
//并且这个Lambda 会有一个String类型的传入参数,和Int类型的返回值
//也就是说 这个函数已经规定了这个Lambda 传入参数是什么类型,返回值是什么类型。
fun textLambda(test:(String) -> Int){
    val str1="aaa"
    val num= test(str1)
    if (num>5) print("短字符串")
    else print("长字符串")
}

那么调用的时候,我就要传入一个符合这个函数要求的lambda表达式

//调用的时候,str1:String-> 8 就是我写的lambda表达式
//lambda表达式中 有textLambda传给我的str1这个参数,但是我没用到
//结果 输出 短字符串
textLambda ({str1:String-> 8})

// 用传给我的字符串的长度作为返回值
//判定结果 长字符串
textLambda ({str1:String-> str1.length})

//kotlin规定 当lambda参数是函数的最后一个参数,可以将表达式移到()后面
textLambda (){str1:String-> str1.length}
//当 lambda参数是函数的唯一一个参数的时候,可以省略掉()
textLambda {str1:String-> str1.length}

//kotlin的推导机制,可以让我们省略掉lambda参数列表的类型声明
textLambda {str1-> str1.length}
//当只有lambda只有一个参数的时候,参数名称可以不写 直接用it指代
textLambda {it.length}

通过以上的例子就会发现,其实Lambda表达式和Int之类的没什么区别,Int代表的是一个值,但是Lambda代表的是一段代码罢了。对于参数是Lambda表达式的函数而言,它会告诉你它要一个Lambda表达式,然后这个表达式中它会告诉你,它将会给你一个什么类型的参数,然后它需要你返回给它一个什么类型的结果。至于中间的过程它一概不管。

JAVA函数式API

当kotlin调用java代码的时候,也可以使用JAVA函数式API。但是要满足以下条件:**调用的java方法接收一个java单抽象方法的接口参数。**以上的句子很难懂但是没关系,例子来解释,Android的java开发中经常要开线程,Thread方法很熟悉吧,就以他为例子。
解释:

 java代码中,看下定义:Thread 方法,参数是Runnable 类型的参数
  public Thread(Runnable target) {
        init(null, target, "Thread-" + nextThreadNum(), 0);
    }
再看下Runnable 的定义,会发现它是一个接口,并且只有一个抽象方法也就是run方法。
public interface Runnable {
 public abstract void run();
}
那么Thread方法它就是满足上面那段话的,首先Thread 是一个java方法,并且它接收的参数Runnable是一个接口,然后这个接口里面有一个抽象方法。
所以说当kotlin中调用Thread方法中那个接口参数的单抽象方法可以写成Lambda表达式

实战

//java中调用thread的写法(匿名类的写法)
   new Thread(new Runnable() {
           @Override
           public void run() {
               System.out.println("线程");
           }
       });
       
// 原模原样改造成kotlin的话,没有new关键字,方法的关键字是fun(匿名类的写法采用了object关键字)
Thread(object: Runnable {
          override fun run() {
               print("线程");
           }
       })
// 但是刚才说了,这个 Thread是满足java函数式api的,也就是说可以简写,因为只有Runnable只有一个待实现方法,所以可以不显示重写run方法
Thread( Runnable {
  print("线程");
       })   

//  Thread方法里不沉溺在一个以上的java单抽象方法接口参数,可以省略接口名字
Thread( {
  print("线程");
       })
       
// lambada表达式是方法的最后一个参数
Thread() {print("线程")}     
 // lambada表达式只有一个lambada表达式的参数,省略括号
 Thread{print("线程")}     
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-03 16:26:11  更:2022-03-03 16:29:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 16:35:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码