Kotlin 学习笔记02

Kotlin基础

  • 声明函数、变量、类、枚举和属性
  • 控制结构
  • 智能转换
  • 异常处理

函数
fun max(a: Int, b: Int): Int {
    return if (a > b) a else b //if 为表达式,是有返回值的
}
//所以也可以写成下面的写法-->表达式函数
fun max(a: Int, b: Int): Int = if(a > b) a else b
//因为kotlin强大的智能类型推断可以省略返回值类型
fun max(a: Int, b:Int) = if(a > b) a else b
复制代码

变量
  • 可变变量
    • var(缩写:variable) 相当于Java中的final
  • 不可变变量
    • val(缩写:value)应该尽量使用
var message: String
val language = listOf("Java","Kotlin")
复制代码

字符串模板
fun main(args: Array<String>) {
    val name = if (args.isNotEmpty()) args[0] else "Kotlin"
    println("Hello, $name")
}
//甚至你可以这样
fun main(args: Array<String>) {
    println("Hello, ${if (args.isNotEmpty()) args[0] else "Kotlin"}")
}
复制代码

类和属性

一般我们这样定义一个类

class Person(val name: String)//值对象(只有数据没有其他代码)
复制代码

注意: 在kotlin中类是默认可见的,就是说在Java代码中应该是这样的

public class Person{
    private final String name; //注意final 因为kotlin代码使用了val
    public Person(String name){
        this.name = name;
    }
    //因为是val 所以没有set方法
    public String getName(){
        return name;
    }
}
复制代码
属性
class Person(
    val name: String, //只读属性,对应Java 没有set方法
    var isMarried: Boolean //对应Java中同时拥有get和set方法
)
//如果我们需要自定义get() set()方法,需要自定义访问器
class Person(
    val name: String,
    //var isMarried: Boolean 不能直接在这里自定义访问器?我需要自定义这怎么办?
){
     val isMerried: Boolean
        get() {
            return true
       }
}
复制代码
目录和包名

注意: 包的层级结构不需要遵循目录层级结构简而意之就是 文件可以随意方法
作者建议是:大多数情况下,遵循Java目录结构是不错的选择,但是kotlin有很多小的类,应该把这些小的类放到同一个目录下

枚举和枚举处理“when”
enum class Color{
    RED,ORANGE,YELLOW,GREEN,BLUE,INDIGO
}
//指定值属性值得枚举
enum class Color(private val r: Int, private val g: Int, private val b: Int) {
    RED(255, 0, 0), ORANGE(255, 165, 0),
    YELLOW(255, 255, 0),GREEN(0,255,0); //这里必须加冒号,当然 如果你不加,idea会自动帮你添加?

    fun rgb() = (r * 256 + g) * 256 + b
}
//下面使用when处理枚举
fun getColor(color: Color) = when (color) {
    Color.RED,Color.ORANGE -> "red"
    Color.YELLOW -> "yellow"
    else -> throw Exception("error")
}
复制代码

when参数可以是任意对象、也可以不带参数


类型智能转换
//这里提出的一个二叉树结构计算值得回味
interface Exper
class Num(val value: Int) : Exper
class Sum(val leftValue: Exper, val rightValue: Exper) : Exper

fun eval(e: Exper): Int {
    if (e is Num) {
        return e.value //不需要强转,智能识别
    }
    if (e is Sum) {
        return eval(e.leftValue) + eval(e.rightValue)//不需要强转,智能识别
    }
    throw IllegalAccessException("Unknown exception")
}
//下面使用when代替if
fun evalWhen(e: Exper): Int = when (e) {
    is Num -> e.value
    is Sum -> evalWhen(e.leftValue)+evalWhen(e.rightValue)
    else -> throw IllegalArgumentException()
}
复制代码

循环
  • 迭代数字
val oneToTen = 1..10

fun fizzBuzz(i: Int) = when{
    i % 15 == 0 -> "fizzBuzz"
    i % 3 ==0 -> "fizz"
    i % 5 ==0 -> "Buzz"
    else -> "$i"
}
//调用
for(i in 1..100){
    println(fizzBuzz(i))
}
//逆序 每次减2
for(i in 100 downTo 1 step 2){
    println(fizzBuzz(i))
}
复制代码
  • 迭代map
//初始化并迭代map
val treeMap = TreeMap<Char, String>()
    for (c in 'A'..'F') {
        val toBinaryString = Integer.toBinaryString(c.toInt())
        treeMap[c] = toBinaryString
    }
//迭代
    for ((letter, binary) in treeMap) {
        println("$letter = $binary")
    }
复制代码

等到结果如下:

  • 使用in检查区间和集合成员
fun recognize(c: Char) = when (c) {
    in '0'..'9' -> "It's a digit"
    in 'A'..'Z' -> "It's a letter"
    else -> throw IllegalArgumentException("I don't know")
}
复制代码

异常
  • kotlin的异常不分受检异常和非受检异常(运行时异常)
  • 异常也是一个表达式可以表示如下
fun readNum(reader: BufferedReader) {
    val num = try {
        Integer.parseInt(reader.readLine())
    } catch (e: NumberFormatException) {
        null //返回一个null值给num
    }
println(num)

//调用
readNum(BufferedReader(StringReader("4")))
}```复制代码

转载于:https://juejin.im/post/5c3180ece51d45520b26a716

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值