Kotlin 基本要素

1 函数和变量

      函数

//     fun max(a: Int, b: Int) : Int {
//          return if (a > b) a else b
//     }

//     fun max(a : Int, b: Int):Int = if (a>b) a else b

fun max(a : Int, b: Int) = if (a>b) a else b

fun main(){
    println(max(10,22))
}

      变量

          可变变量和不可变量

          声明变量的关键字有两个 :
          • val (来自 value) 一一不可变引用。使用 val 声明的变量不能在初始化之后再次赋值。它对应的是 Java 的 final 变量。

          • var (来自 variable) 一一可变引用。这种变量的值可以被改变。这种声明对应的是普通(非 final)的 Java 变量。 

fun main(){
    //定义了 val 变量的代码块执行期间, val 变量只能进行唯一一次初始化。
    val isSuccess=false
    val message:String
    message= if (isSuccess) "Success" else "fail"
    println(message)
    // val 引用自身是不可变的,但是它指向的对象可能是可变的。
    val languages = arrayListOf("Java")
    languages.add("Android")
    println(languages)
}

       注意:var 关键字允许变量改变自己的值,但它的类型改变不了。

2 类和属性

       类

         把数据和处理数据的代码封装成一个单一的实体

//这种类(只有数据没有其他代码)通常被叫作值对象
class Dog(val name: String, var isOld: Boolean)

      属性

         Kotlin 中,属性是头等的语言特性,类中声明一个属性和声明一个变量一样:使用 val 和 var 关键字。声明成 val 的属性是只读的,而 var 属性是可变的。

class Cat {
    var name: String=""
    var age: Int = 0
}

class Teacher(val name: String, val age: Int)


fun main(){
    val cat=Cat()
    cat.age=15
    cat.name="88"
    println(cat.age)

    val teacher=Teacher("sss",44)
    println(teacher.name)
}

    自定义访问器

class Rectangle (private val height: Int, private val width: Int){
    val isSquare: Boolean
        get() = height == width
}

fun createRandomRectangle() : Boolean{
    val random = Random()
    return Rectangle(random.nextInt(), random.nextInt()).isSquare
}

   枚举类

          简单枚举类

enum class Color {
    RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET
}

          带属性枚举类

enum class Color(val r: Int, val g: Int, val b: Int) {
    RED(255,0,0), ORANGE(255,165,0),
    YELLOW(255,255,0), GREEN(0,255,0),
    BLUE(0,0,255);
    // 给枚举类定义一个方法
    fun rgb()= (r * 256 +g ) * 256 + b
}

fun main(){
    val color=Color.BLUE.rgb()
    println(color)
}

   注意:如果要在枚举类中定义任何方法,就要使用 分号把枚举常量列表和方法定义分开

        使用"when"处理枚举类

fun main(){
    println(getMnemonic(ColorOthers.YELLOW))
     println(getWarmth(ColorOthers.BLUE))
}

fun getMnemonic(color: ColorOthers) =
        when(color){
            ColorOthers . RED ->"Richard"
            ColorOthers.ORANGE ->"Of"
            ColorOthers.YELLOW ->"York"
            ColorOthers .GREEN ->"Gave"
            ColorOthers.BLUE ->"Battle"
            ColorOthers.INDIGO ->"In"
            ColorOthers.VIOLET ->"Vain"
        }

fun getWarmth(color: ColorOthers) =
    when(color){
        ColorOthers.RED, ColorOthers.ORANGE, ColorOthers.YELLOW -> "warm"
        ColorOthers.GREEN -> "neutral"
        ColorOthers. BLUE, ColorOthers.INDIGO, ColorOthers.VIOLET ->"cold "
    }

    “when”结构中使用任意对象

fun mix(c1: ColorOthers,c2 : ColorOthers)=
    when (setOf(c1,c2)){
        setOf(RED, YELLOW) -> ORANGE
        setOf(YELLOW, BLUE) ->GREEN
        setOf(BLUE, VIOLET) -> INDIGO
        else -> throw Exception ("Dirty color")
    }

fun main(){
    println(mix(YELLOW,RED)) // ORANGE
}

    枚举类ColorOthers

enum class ColorOthers {
    RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET
}

     不带参数的“when”

import XXX.shapes.ColorOthers.*
fun main(){
    println(mixOptimized(BLUE,VIOLET))
}

fun mixOptimized(c1: ColorOthers,c2 : ColorOthers)=
    when {
        (c1 == RED && c2 == YELLOW) || (c1 == YELLOW && c2 == RED) -> ORANGE
        (c1 == YELLOW && c2 == BLUE) || (c1 == BLUE && c2 == YELLOW) -> GREEN
        (c1 == BLUE && c2 == VIOLET) || (c1 == VIOLET && c2 == BLUE) -> INDIGO
        else -> throw Exception ("Dirty color")
    }

    智能转换 (Kotlin 中,如果你检查过一个变量是某种类型, 后面就不再需要转换它,可以就把它当作你检查过的类型使用)

    智能转换只在变量经过 is 检查且之后不再发生变化的情况下有效。 Kotlin 中,使用 is 检查来判断一个变量是否是某种类型。

fun main(){
   println(eval(Sum(Sum(Num(1) , Num (2)) , Num (4))))
}
fun eval(e: Expr): Int {
   if (e is Num) {
       val n = e as Num
       return n.value
   }
   if (e is Sum) {
       return eval(e.right) + eval(e.left)
   }
   throw IllegalArgumentException("Unknown expression")
}

   接口类  Expr

interface Expr {
    class Num(val value: Int) :Expr
    class Sum(val left: Expr, val right :Expr) :Expr
}

   用if 表达式改写eval 方法

fun eval(e: Expr): Int =
   if (e is Num){
      e.value
   }else if (e is Sum){
      evalIf(e.left)  + evalIf(e.right)
   }else{
      throw IllegalArgumentException("Unknown expression")
   }

用when 表达式改写eval 方法

 fun eval(e: Expr): Int =
   when (e){
     is Num -> e.value
     is Sum -> evalWhen(e.left) + evalWhen(e.right)
     else -> throw IllegalArgumentException("Unknown expression")
   }

代码块作为“if”和“when”的分支

 fun evalMix(e: Expr): Int =
    when (e){
        is Num ->{
            println("num: ${e.value}")
            e.value
        }
        is Sum ->{
           val left= evalMix(e.left)
           val right= evalMix(e.right)
           println("sum: $left + $right")
           left+right
        }
        else ->throw IllegalArgumentException("Unknown expression")
    }


fun main(){
    println(evalMix(Sum(Sum(Num(1) , Num (2)) , Num (4))))
}

---------------------------
System.out: num: 1
System.out: num: 2
System.out: sum: 1 + 2
System.out: num: 4
System.out: sum: 3 + 4
System.out: 7

 3   迭代事物: while循环和for循环

     while 循环

    var sum: Int=0
    var condition: Boolean = true
    while(condition){//当condition为true时执行循环体
      for (i in 1..100){
          sum += i
          if (i == 100)
          condition=false
      }
    }

    do-while 循环

    //循环体第一次会无条件执行,此后,当condition为ture时会执行
    do {
        for (i in 1..100){
            sum += i
            if (i == 100)
            condition=false
        }
    }while (condition)

     迭代数字:区间

   在Kotlin 中没有常规的Java for 循环。在这种循环中,先初始化变量,在循环的每一步更新它的值,并在值满足某个限制条件时退出循环。 为了替代这种最常见的循环用法, Kotlin 使用了区间的概念。区间本质上就是两个值之间的问隔,这两个值通常是数字 : 一个起始值, 一个 结束值。使用..运算符来表示区间: 

val i=1..10
fun fizzBuzz(number: Int)= when{
    number % 15 == 0 -> "FizzBuzz"
    number % 3 == 0 -> "Fizz"
    number % 5 == 0 -> "Buzz "
    else ->"$number"
}

fun main(){
    for (i in 1..100){
        println(fizzBuzz(i))
    }
    for (i in 100 downTo 1 step 2){
        println(fizzBuzz(i))
    }
}

      迭代数字:map

for main(){
    val binaryReps = TreeMap<Char,String>()
    for (c in 'A'..'F'){
        val binary = Integer.toBinaryString(c.toInt())
        binaryReps[c] = binary
    }
    for ((letter, binary) in binaryReps){
        println("$letter = $binary")
    }
    --------------------------------------------------
    A = 1000001
    B = 1000010
    C = 1000011
    D = 1000100
    E = 1000101
    F = 1000110  

    //迭代集合的同时跟踪当前项的下标
    val list= arrayListOf("10","11","1001")
    for ((index, element) in list.withIndex()){
        println("$index = $element")
    }
}  

     使用 in 检查集合和区间的成员    

             使用 in 运算符来检查一个值是否在区间中,或者它的逆运算,!n,来检查这个值是否不在区间中。

fun main(){
    println(isLetter('q'))
    println(isNotDigit('x'))
    //用in 检查作为when分支
    println(recognize('$'))
}

fun isLetter(c: Char)= c in 'a'..'z' || c in 'A'..'Z'
fun isNotDigit(c: Char) = c !in '0'..'9'
fun recognize(c: Char) = when(c) {
    in '0'..'9' -> "It’s a digit!"
    in 'a'..'z',in 'A'..'Z' -> "It’s a letter!"
    else -> "I don’t know..."
}

区间也不仅限于字符。假如有一个支持实例比较操作的任意类(实现了 java. lang.Comparable 接口),就能创建这种类型的对象的区间。如果是这样的区间, 并不能列举出这个区间中的所有对象。

 println("Kotlin" in "Java".."Scala") // true
 println("Kotlin" in setOf("Java","Scala")) // false

 4   Kotlin中的异常

     Kotlin的异常处理

fun main(){
    val number = 10
    val percentage =
        if (number in 0..100)
            number
        else
            //Kotlin 中 throw 结构是一个表达式,能作为另一个表达式 的一部分使用 
            throw IllegalArgumentException("A percentage value must be between 0 and 100: $number ")
}

     try、catch 和 finally

            Kotlin 并不区分受检异常和未受检异常。不用指定函数抛出的异常, 而且可以处理也可以不处理异常。

fun readNumber(reader: BufferedReader): Int?{
    return try {
        val line=reader.readLine()
        Integer.parseInt(line)
    } catch (e: NumberFormatException){
        null
    } finally {
        reader.close()
    }
}
fun main(){
    val reader= BufferedReader(StringReader("258"))
}

      try作为表达式

fun readNumber(reader: BufferedReader){
  //Kotiin 中的 try 关键字就像 if 和 when 一样,引入了一个表达式,可以把它的值赋给一个变量
   val number = try {
       Integer.parseInt(reader.readLine())
   }catch (e: NumberFormatException){
       //catch代码块之后函数不会继续执行
       return
   }
   println(number)
}
fun main(){
   val reader = BufferedReader(StringReader("not a number"))
   readNumber(reader)
}
fun readNumber(reader: BufferedReader){
  //Kotiin 中的 try 关键字就像 if 和 when 一样,引入了一个表达式,可以把它的值赋给一个变量
   val number = try {
       Integer.parseInt(reader.readLine())
   }catch (e: NumberFormatException){
       null
   }
   println(number)
}
fun main(){
   val reader = BufferedReader(StringReader("not a number"))
   readNumber(reader) // null
}

重要内容概况

• fun 关键字用来声明函数。 val 关键字和 var 关键字分别用来声明只读变量 和可变变量。

• 在变量名称前加上$前缀或者用 ${}包围一个表达式,来把值注入到字符串中。

• if 是带返回值的表达式。

• 在检查过变量具有某种类型之后不必显式地转换它的类型,编译器自动帮你完成。

• 简洁的语法 1. . 5 会创建一个区间。区间和数列允许 Kotlin 在 for 循环中使 用统一的语法和同一套抽象机制,并且还可以使用 in 运算符    和!in 运算符来检查值是否属于某个区间。

• Kotlin 中的异常处理和 Java 非常相似,除了 Kotlin 不要求你声明函数可以抛出的异常。

 

参考内容:Kotlin 实战

下一篇:函数的定义与调用:https://blog.csdn.net/lwj_hewo/article/details/97916709

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值