Kotlin热身篇: 简介与基本用法

改不完的 Bug,写不完的矫情。公众号 杨正友 现在专注移动基础平台开发 ,涵盖音视频, APM和信息安全等各个知识领域;只做全网最 Geek 的公众号,欢迎您的关注!精彩内容不容错过~

一. kotlin概念

Kotlin 拥有强大的生态,不仅支持 Android开发,服务端,前端和原生环境,同时Kotlin是一门跑在Java虚拟机上的函数式语言。并符合JVM的设计规范,如: 类型擦除,装箱和拆箱,那么Kotlin和Java有什么共同点呢?

二. kotlin和java8的相同点

说完共同点我们再聊聊他们的不同点吧~

三. kotlin和java8的不同点

四. kotlin 和 java 互转

4.1 kotlin 转 java

选中导航栏: 右键 -> Tools -> Kotlin -> Show Kotlin Bytecode -> Decompile

4.2 java 转 kotlin

选中文件标签: 右键 -> Convert Java File To Kotlin File

查看Kotlin字节码

五. Kotlin 基础语法

5.1 kotlin方法

5.1.1 kotlin方法声明

Kotlin 定义方式比较简单,括号中是参数,格式: "函数名(参数名称: 参数): 返回类型",返回类型定义在括号外 如:T

    fun <T> reflectField(instance: Any?, name: String): T? {
        if (instance == nullreturn null
        try {
            val field = instance.javaClass.getDeclaredField(name)
            field.isAccessible = true
            return field.get(instance) as T
        } catch (e: Exception) {
            e.printStackTrace()
        }
        return null
    }
5.1.2 kotlin方法调用

5.1.3 kotlin方法自动传参

Kotlin 可以在 构造方法或者相关函数大括号里面设置默认参数,这样传参就可以使用默认参数了,我们具体看看怎么使用的吧~

第二个参数可以省略,此时会使用默认值 不省略时跟Java无异

5.1.4 kotlin named argument

named argument 的中文含义是 可以根据 参数名 进行传递参数,传参顺序不需要严格按照函数定义顺序,这样就可以避免参数误传的问题了

5.2 kotlin 变量和常量

varible(变量) 通过 var 关键字来声明,格式为 var 变量名[:类型] = [初始值]

    private var mConfig = RabbitConfig()
    lateinit var application: Application
    private var isInit = false

而val 声明的变量是只读变量,它的引用不可更改,事实上我们依然可以更改其中引用对象的可变成员.类似于java的final

当然 kotlin 也有自动拆箱和装箱将Int翻译成Java的int或Integer以提高性能

    private var Int = 8

Kotlin 会自动给属性加上 setter 和 getter 方法

class RabbitConfig(
    var enable: Boolean = true,
    var enableLog: Boolean = true,
    @Transient var uiConfig: RabbitUiConfig = RabbitUiConfig(),
    var storageConfig: RabbitStorageConfig = RabbitStorageConfig(),
    var monitorConfig: RabbitMonitorConfig = RabbitMonitorConfig(),
    var reportConfig: RabbitReportConfig = RabbitReportConfig()
)

用Show Kotlin Bytecode 翻译一下结果如下:

如果想重写 set() 或 get() 方法 可以这么做

data class RabbitConfig(
    var enable: Boolean = true,
    var enableLog: Boolean = true,
    @Transient var uiConfig: RabbitUiConfig = RabbitUiConfig(),
    var storageConfig: RabbitStorageConfig = RabbitStorageConfig(),
    var monitorConfig: RabbitMonitorConfig = RabbitMonitorConfig(),
    var reportConfig: RabbitReportConfig = RabbitReportConfig()
) {
    var age: Int = 10
        set(value) {
            println("setter $value")
            field = value
        }

    val createTimeShow: () -> String
        get() = { this.toString() }
}

5.3 kotlin null 判断

以上声明的变量皆为非空变量,即不允许为空值。如果需要声明一个变量可为空,仅需在变量类型后面加上?

val n: String?=null

声明一个变量可为空,仅需在变量类型后面加上?

// 在使用n的时候,由于n可能为null,直接使用编译器会报错
n.length  
// 正确的使用方式是,在使用前,做判空处理
// 如果变量为空,只需在变量类型后面加上?,这样就不会访问length属性了
n?.length  
// 如果确定一个可空变量不为空
// 可以加!!告诉编译器它不为空
n!!.length  

5.4 kotlin 字符串模板


val i=10
val s="i=$i"//求值结果为:“i=10”

val s="adb"
val str="$s.length is ${s.length}"//执行结果为“adb.length is 3” 

5.5 kotlin 双冒号操作符

双冒号操作符 表示把一个方法(变量)当做一个参数,传递到另一个方法(变量)中进行使用,和Java8类似

   /**
    * 把功能的名字转换为对应存储数据对象
    * */

   fun nameToInfoClass(name: String): Class<*> {
       return when (name) {
           RabbitMonitorProtocol.BLOCK.name -> RabbitBlockFrameInfo::class.java
           RabbitMonitorProtocol.APP_SPEED.name -> RabbitAppStartSpeedInfo::class.java
           RabbitMonitorProtocol.FPS.name -> RabbitFPSInfo::class.java
           RabbitMonitorProtocol.MEMORY.name -> RabbitMemoryInfo::class.java
           RabbitMonitorProtocol.EXCEPTION.name -> RabbitExceptionInfo::class.java
           RabbitMonitorProtocol.NET.name -> RabbitHttpLogInfo::class.java
           RabbitMonitorProtocol.SLOW_METHOD.name -> RabbitSlowMethodInfo::class.java
           RabbitMonitorProtocol.BLOCK_CALL.name -> RabbitBlockFrameInfo::class.java
           RabbitMonitorProtocol.GLOBAL_MONITOR.name -> RabbitAppPerformanceInfo::class.java
           RabbitMonitorProtocol.ANR.name -> RabbitAnrInfo::class.java
           else -> RabbitFPSInfo::class.java
       }
   }

5.6 kotlin 匿名函数

kotlin 正常函数

//---------------------案例一--------------------------
a(fun b(param: Int): String {
  return param.toString()
});
val d = fun b(param: Int): String {
  return param.toString()
}
//---------------------案例二--------------------------
view.setOnClickListener(new OnClickListener() {
  @Override
  void onClick(View v) {
    switchToNextPage();
  }
});

kotlin 匿名函数

//-----------------------案例一------------------------
a(fun(param: Int): String {
  return param.toString()
});
val d = fun(param: Int): String {
  return param.toString()
}
//-----------------------案例二------------------------
fun setOnClickListener(onClick: (View) -> Unit) {
  this.onClick = onClick
}
view.setOnClickListener(fun(v: View)Unit) {
  switchToNextPage()
})

5.7 kotlin lambda 语法糖

view.setOnClickListener() { v: View ->
  switchToNextPage()
}

//-----------------------------------------------
view.setOnClickListener { v: View ->
  switchToNextPage()
}
//-----------------------------------------------
 

mSimpleListRv.setOnClickListener {
            startActivity(Intent(this, SimpleListActivity::class.java))
        }

//-----------------------------------------------
view.setOnClickListener {
  switchToNextPage()
  it.setVisibility(GONE)
}

5.8 kotlin 表达式

5.8.1 kotlin for循环 和 范围 表达式
5.8.1.1 kotlin for循环
// -----------------------正序遍历-----------------------
for (index in 1..100){
            print(index)
        }
        

5.8.1.2 范围 表达式
// -----------------------倒序遍历-----------------------
for (index in 100 downTo 1){
            print(index)
        }
        
// -----------------------不使用1作为遍历的步长-----------------------

 for (index in 1..100 step 2){
            print(index)//会输出1..3..5......
        }
        
// -----------------------创建一个不包含末尾元素的区间-----------------------

for (index in 1 until 10){
            println(index)//输出0..9
        }
        
// -----------------------遍历一个数组/列表,想同时取出下标和元素-----------------------

val array = arrayOf("a""b""c")
        for ((index,e) in array.withIndex()){
            println("下标=$index----元素=$e")
        }
        // -----------------------遍历一个数组/列表,只取出下标-----------------------
        val array = arrayOf("a""b""c")
        for (index in array.indices){
            println("index=$index")//输出0,1,2
        }
        // -----------------------遍历取元素-----------------------
        val array = arrayOf("a""b""c")
        for (element in array){
            println("element=$element")//输出a,b,c
        }
5.8.2 kotlin 枚举和 when 表达式
5.8.2.1 kotlin 枚举

Kotlin中,枚举类型以类的形式存在,因此叫做枚举类,如下是实例:

enum class Color {
    RED, GREEN, BLUE
}
//---------------使用-------------------
var color: Color = Color.BLUE

var color2 = Color.GREEN

// 比较两个枚举类型变量
var bool: Boolean = color == color2

//---------------为枚举值指定数值-------------------
enum class Direction private constructor(var value: Int) {
    NORTH(1), WEST(2), EAST(3), SOUTH(4)
}
5.8.2.2 kotlin when 表达式

when 表达式 可以支持自动转型(Auto-casting),我们来看个案例:

when (view) {
     is TextView -> toast(view.text)
     is RecyclerView -> toast("Item count = ${view.adapter.itemCount}")
     is SearchView -> toast("Current query: ${view.query}")
     else -> toast("View type not supported")
}
5.8.3 kotlin 中缀表达式

kotlin 中缀表达式只有一个参数,且用infix修饰的函数,infix 自定义运算符的中缀表达式。本没有on,自定义一个,不需要类名.方法即可调用

// 书
class Book{
   // 传入任意类型,返回一个Boolean类型的参数
    infix fun on(any: Any)Boolean{
        return true
    }
}
// 桌子
class Desk

fun main(args: Array<String>) {
    if(Book() on Desk()){
        println("书在桌上")
    }
}
5.8.3 kotlin 复合表达式
5.8.3.1 '?.'

?.表示,如果foo这时候是一个空的,则返回null,否则就返回foo.bar()

if (foo != null){
   return foo.bar()
}else{

   return null
}
5.8.3.2 '?:'

?: 作用是当数据非空时,直接返回数据,而当数据为空时,返回合并到的数据。利用该运算符,可以很容易的把可空类型转换为非空类型。

 if(foo!=null)
{
    foo
}
else
{
    bar
}
foo?.length?:-1
5.8.3.3 '!!'

Kotlin 中 !! 表示非空断言运算符

if(foo!=null)
{
   foo
}else
{
   return NullPointerException

5.8.3.4 'as?'

Kotlin 可以使用安全转换操作符as?,它可以在失败时返回null

foo as? type
if(foo is Stype)
{
    foo as Type
}else
{
    null
}
5.8.3.5 '?'

?表示可空类型与非空类型,Kotlin 的类型系统旨在消除来自代码空引用的危险,看一下代码如下:

foo?
var foo?="abc"
foo=null
// 编译成功 foo可为空
var foo="abc"
foo=null
// 编译失败 foo不可以为空

六. 总结

本文先从kotlin概念带大家进入kotlin语言,然后说了一下kotlin和java8的异同以及相互转换方式,最后对Kotlin基础语法进行一一阐述,如: kotlin 方法和变量使用,kotlin字符串模板, lambada表达式,以及各种表达式的实际运用。好了今天的kotlin就说到这里了,如果大家对此有什么疑问欢迎到评论区留言~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值