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")))
}```复制代码