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