美文网首页kotlin
kotlin之基础

kotlin之基础

作者: 海晨忆 | 来源:发表于2019-06-11 13:36 被阅读6次

个人博客:haichenyi.com。感谢关注

  自从18年上一家公司用kotlin做了项目之后,新公司就没有用过kotlin了,都快要忘完了,最近又想起来了,再捡了一下吧。

定义变量的方式

  java:类型+变量名+值+逗号

int a = 5;

  kotlin:var/val+变量名+(:类型)+值(ps:类型可省略)

  var:可变变量(可以重新分配值)

  val:只读变量(初始化的时候必须赋值,不能修改)

var c:int
    c = 5
var c = 5    
val b = 5

函数

  java:public/private/protected+返回类型+方法名+括号参数+大括号方法体

public void add(int a ,int b){
    
}
public int add1(int a,int b){
    return a+b;
}

  kotlin:fun+方法名+括号参数+(:返回类型)+大括号方法体

  返回类型Unit类型,对应java的void,即无返回值,可省略

fun add(a:int,b:int):Unit{
    
}

fun add(a:int,b:int){
    
}

fun add1(a:int,b:int):int{
  return a+b  
}

if表达式(java中三目运算符)

  把a和b两个数中值大的赋值给c

java:三目运算符
int c = a > b ? a : b
kotlin:if表达式
val c = if( a > b) a else b

for循环

//java
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
for (int j = 0; j <= list.size(); j++) {
    Log.v("wz", list.get(j));
}

//kotlin
val list = listOf("a","b","c","d")
for(item in list){
    Log.v("wz",item)
}

//上面这个for循环等同于forEach

list.forEach{
    Log.v("wz",it)
}

//上面两种循环拿不到下标

for(index in list.indices){
    //美元符号的用法见后面
    Log.v("wz","第$index 个item的值是${list[index]}")
}
//上面这种就可以拿到for循环的下标
//kotlin中String类型的变量也可以for循环遍历每一个char的值

美元符号($)

  把$符号放在变量前面,输出的就是变量的值

val i = 3
Log.v("wz","i的值是:$i")
//输出的是:i的值是:3

Log.v("wz","i的值是:$3")
//输出的是:i的值是:$3

== 和 ===的区别

  类似于java中的==和equals的区别

  java:==判断值是否相等,equals判断物理地址是否相等

  kotlin:==判断物理地址是否相等,===判断值是否相等

数据类型的转换:toInt(),toBoolean()等等

//java中不同数据类型的相互转换是强转
String s = "1";
int a = (int)s;

//kotlin中没有强转提供了转换的方法
var s = "1"
var a = s.toInt()
var a1 = s.toBoolean()

is运算符

  个人觉得is运算符类似于java中的instanceof关键字

//java:判断某个变量是否是某个类型的
String s = "1";
if(s instanceof String){
    
}

//kotlin:判断某个变量是否是某个类型
var s = "1"
if(s is String){
    
}

//既然上面说了is是个运算符,运算符当然可以加非
if(s !is String){

}

空指针和lateinit

  要明确一点:java中才会有空指针异常,kotlin中不存在空指针异常,因为它有非空判断机制

  比方说,我们如果要在kotlin定义一个Bitmap变量,我们知道Bitmap是非常占内存的,用完之后我们要手动置空

  在类型的后面加上问号,用的时候也要加问号才能用,表示不为空的时候才会往下走,如果为空就不会往下走了

var bitmap:Bitmap? = null
var w = bitmap?.width

  那么,我们如果要定义一个不可能为空的对象怎么定义呢?

lateinit var bitmap:Bitmap
bitmap.width

黑科技:when表达式和Any(任意类型)

  when表达式取代java中的switch,when的返回值依据每一个条件的返回值来定,可以返回任意类型,从上往下按顺序执行,else不能少

lateinit var obj : Any
var b = when(obj){
    1 -> 2
    is String -> 3
    3,4 -> "obj等于3或者等于4"
    in 10..20 -> "obj在10到20之间"
    else -> true
}

  比方说这里,先定义个可以是任意类型变量的的obj,如果传进来的是Int类型的1,则返回int类型的2。如果传进来的是String类型的变量,则返回int类型的3。其他,则返回boolean类型的true

  when可以取代 if-else if链。如

val x = 10
when {
    x < 10 -> "x小于10"
    x in 10..20 -> "x在10到20之间"
    x in 21..40 -> "x在21到40之间"
    else -> "x大于40"
}

区间

  顾名思义:在某个范围内

//等同于 x >= 1 && x <= 4(包括1,包括4),从1到4
x in 1..4 //1,2,3,4

//等同于 x >= 1 && x < 4(包括1,不包括4),从1到4
x in 1 until 4 //1,2,3

//包括1,包括4 ,从4到1
x in 4 downTo 1 //4,3,2,1

//从1到8,每隔两个循环一次,也就是1,3,5,7
i in 1..8 step 2

//从8到1,每隔两个循环一次,也就是8,6,4,2
i in 8 downTo 1 step 2

//从8到1,每隔两个,并且要满足能整除3的,这里就是6
i in (8 downTo 1 step 2).filter { it % 3 == 0 }
//上面的关键字filter,还有map等,用过RxJava的应该很眼熟

相关文章

网友评论

    本文标题:kotlin之基础

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