Kotlin 基础

基本语法,类,接口,继承,内部类

使用if

fun if1() {

    //判断
    // 传统用法
  var a = 7
  var b = 3
 var max = a
  if (a < b) max = b
 print("max"+max+"a"+a+"b"+b)

使用 else

var max: Int
 if (a > b) {
max = a
} else {
  max = b
   }

作为表达式

val max = if (a > b) a else b

我们也可以把IF表达式的结果赋值给一个变量。

  val max = if (a > b) {
      print("Choose a")
     a
 } else {
     print("Choose b")
      b
   }
  print(max)

if

    var x = 0
    if (x > 0) {
        println("x 大于 0")
    } else if (x == 0) {
        println("x 等于 0")
    } else {
        println("x 小于 0")
    }

    var a = 1
    var b = 2
    val c = if (a >= b) a else b
    println("c 的值为 $c")

使用 in 运算符来检测某个数字是否在指定区间内,区间格式为 x..y :

    val x1 = 5
    val y = 9
    if (x1 in 1..8) {
        println("x1 在区间内")
    }
}

数组

/**
 * 可变参数会在函数体中,自动转变为数组类型
 * 数组类型不能作为参数,直接传递给可变参
 * 在数组类型前面添加 * ,可以传递给可变参数
 *
 */
fun main() {
    foo("1", "2", "3")
}

fun foo(vararg args: String) {
    bar1(*args)
    if2(args)
}

fun bar1(vararg args: String) {
    println(args.contentToString())
}

fun if2(args: Array<out String>) {
    bar1(*args)

    //赋值
    //[1,2,3]
    val a = arrayOf(1, 2, 3)

    //赋值
    //[0,2,4]
    val b = Array(3, { i -> (i * 2) })

    //读取数组内容
    println(a[0])    // 输出结果:1
    println(b[1])    // 输出结果:2

    val x: IntArray = intArrayOf(1, 2, 3)
    x[0] = x[1] + x[2]
}

switch == when

 //条件必须是一个常量
    var x: Int
    x = 4
    when (x) {
        1 -> print("x == 1")
        2 -> print("x == 2")
        else -> { // 注意这个块
            print("x 不是 1 ,也不是 2")
        }
    }

    //在 when 中,else 同 switch 的 default。如果其他分支都不满足条件将会求值 else 分支。
    when (x) {
        0, 1 -> print("x == 0 or x == 1")
        else -> print("otherwise")
    }

    //我们也可以检测一个值在(in)或者不在(!in)一个区间或者集合中
    when (x) {
        in 1..10 -> print("x 在该区间范围内")
    //  in validNumbers -> print("x is valid")
        //加 ! 是非
        !in 10..20 -> print("x is outside the range")
        else -> print("none of the above")
    }

when 中使用 in 运算符来判断集合内是否包含某实例

    val items = setOf("apple", "banana", "kiwi")
        when {
            "orange" in items -> println("juicy")
            "apple" in items -> println("apple is fine too")
        }

可变参数

    var name = "hello world"
    print(name)

lambda函数(匿名函数) 参数格式为:参数 : 类型

    //定义一个sum函数     a b 表示变量
    //val   定义常量和变量     不可更改    类似final
    val sum: (Int, Int) -> Int = { a, b -> a + b }
    // int a;   int b;     a+b=1+2
    print(sum(1, 2));    //输出3

外部类

    Green("" + sum(1, 2)).grn()

var 定义一个可变的变量

    var c: Int

可以根据值反推回去是什么类型 弱类型语言(可以不用给他类型)

    var b = 1.0

字符串的脚本语言用法

    //  $ 表示一个变量名或者变量值
    //  $varName 表示变量值
    //  ${varName.fun()} 表示变量的方法返回值
    //TODO   第一种方式
    var a = 1   //可变参数
    //这种写法  字符串在内存里面单独存储  开辟了一个新的存储空间 存储方式和常量是一样的
    val s1 = "a is $a"      //模板中的简单名称  字符串模板
    //TODO   第二种方式
    a = 2
    //                          is替换成was
    val s2 = "${s1.replace("is", "was")}, but now is $a"
    print(s2)

类型后面加?表示可为空

    var age: String? = "23"
    // !!.  抛出空指针异常
    val ages = age!!.toInt()
    // ?.  不做处理返回 null
    val ages1 = age?.toInt()
    //age为空返回-1
    val ages2 = age?.toInt() ?: -1
    /**
     * 参数可以为空,不用传参数的值
     * 声明一个字符串变量
     * 加了一个 ? 表示这个值可以出现为空的情况
     * TODO 第一种
     * 调用的时候在后面加上   !!  抛出空指针异常
     * TODO 第二种
     * ?. 后面不做处理     返回null
     * TODO 第三种
     * ?:-1    没有值的情况下、为空返回-1
     */

区间 类型的判断

    //循环1-4     1..4   .. 区间---递增的
    for (i in 1..4) print(i) // 输出“1234”
    //步长
    // 使用 step 指定步长
    //如果每次输出不是++    是+2/+3..    i每一次执行加多少
    for (i in 1..4 step 2) print(i) // 输出“13”
    //倒着输出  downTo  4 3 2 1     step  步长  一次-2
    for (i in 4 downTo 1 step 2) print(i) // 输出“42”
    // 使用 until 函数排除结束元素
    //排除元素  until  不能包含10   包前不包后
    for (i in 1 until 10) {   // i in [1, 10) 排除了 10
        println(i)
    }

位操作符

//        shl(bits) – 左移位 (Java’s <<)
//        shr(bits) – 右移位 (Java’s >>)
//        ushr(bits) – 无符号右移位 (Java’s >>>)
//        and(bits) – 与
//        or(bits) – 或
//        xor(bits) – 异或
//        inv() – 反向

forEach

    var arr = arrayOf(1, 2, 3, 4)
    arr.forEach {
        var e = it;
        print(e);
    }

//外部类

class Green(var name: String) {
    fun grn() {
        Log.e("TAG", "grn:$name")// 成员函数
    }
}

类型检测和类型转换 Any 任意类型(任何) ? 返回值可能为空

 fun getStringLength(obj: Any): Int? {
        // is   表示是一个字符串就执行这个   不是就执行其他的
        if (obj is String) {
            // 做过类型判断以后,obj会被系统自动转换为String类型
            return obj.length
        }

        // !is  不是这个类型就执行这句话
        //在这里还有一种方法,与Java中instanceof不同,使用!is
        // if (obj !is String){
        //   // XXX
        // }

        // 这里的obj仍然是Any类型的引用
        return null
}

//基本类型 和 java一样

//比较两个值是否相等
fun main1(args: Array<String>) {
    val a: Int = 10000
    println(a === a) // true,值相等,对象地址相等

    //经过了装箱,创建了两个不同的对象
    val boxedA: Int? = a
    val anotherBoxedA: Int? = a

    //虽然经过了装箱,但是值是相等的,都是10000
    println(boxedA === anotherBoxedA) //  false,值相等,对象地址不一样
    println(boxedA == anotherBoxedA) // true,值相等
}

字符串模板

//字符串可以包含模板表达式 ,即一些小段代码,会求值并把结果合并到字符串中。 模板表达式以美元符($)开头,由一个简单的名字构成:
fun main2(args: Array<String>) {
    val i = 10
    val s = "i = $i" // 求值结果为 "i = 10"
    println(s)
}

用花括号扩起来的任意表达式:

fun main3(args: Array<String>) {
    val s = "runoob"
    val str = "$s.length is ${s.length}" // 求值结果为 "runoob.length is 6"
    println(str)
}

原生字符串和转义字符串内部都支持模板。 如果你需要在原生字符串中表示字面值 $ 字符(它 不支持反斜杠转义)

fun main4(args: Array<String>) {
    val price = """
${'$'}9.99
"""
    println(price)  // 求值结果为 $9.99
}

kotlin recycle列表

recycle.layoutManager = GridLayoutManager(this, 2)

    //todo  数据源
    var list = arrayListOf<String>()
    for (i in 0..10) {
        list.add("爱好$i")
    }
    var kotlinadapter = KotlinAdapter(list, this)
    recycle.adapter = kotlinadapter

    kotlinadapter.setOncli(object : KotlinCallback {
        override fun onClick(pos: Int) {
            Toast.makeText(this@MainActivity, list.get(pos), Toast.LENGTH_SHORT).show()
        }
    })

kotlin 适配器

class KotlinAdapter(private val list: List<String>, private val mContext: Context) :
    RecyclerView.Adapter<KotlinAdapter.ViewHolder>() {


//todo  接口回调
private var KotlinCallback: KotlinCallback? = null
fun setOncli(KotlinCallback: KotlinCallback) {
    this.KotlinCallback = KotlinCallback
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): KotlinAdapter.ViewHolder {
    val view: View = LayoutInflater.from(mContext).inflate(R.layout.kotlin_item_layout, null)
    return ViewHolder(view)
}

override fun getItemCount(): Int {
    return list.size
}

override fun onBindViewHolder(holder: KotlinAdapter.ViewHolder, position: Int) {
    with(holder?.itemView!!) {
        tv_text.text = list.get(position)
    }
    holder.itemView.setOnClickListener { KotlinCallback!!.onClick(position) }
}

class ViewHolder(item: View) : RecyclerView.ViewHolder(item)

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容