以下内容是整理《Kotlin实战》中的内容。
第二章 Kotlin基础 中的内容,简单的栗子,简单的与Java的比较。
先贴出小结,然后是每一项内容的展开:
1、fun关键字用来声明函数。val关键字和var关键字分别用来声明只读变量和可变变量。
2、字符串模版帮助你避免烦琐的字符串连接。在变量名称前加上$前缀或者用 ${} 包围一个表达式,来把值注入到字符串中。
3、值对象类在Kotlin中以简洁的方式表示。
4、熟悉的if现在是带返回值的表达式。
5、when表达式类似于Java中的switch但功能强大。
6、在检查过变量具有某种类型之后不必显示的转换它的类型:编译器使用智能转换自动帮你完成。
7、for、while和do-while循环于Java类似,但是for循环现在更加方便,特别是当你需要跌打map的时候,又或是迭代集合需要下标的时候。
8、简洁的语法1..5会创建一个区间。
区间和数列允许Kotlin在for循环中使用统一的语法和同一套抽象机制,
并且还可以使用in运算符和!in运算符来检查是否属于某个区间。
9、Kotlin中的异常处理和Java非常相似,除了Kotlin不要求你声明函数可以抛出的异常。
一).简介
1、Kotlin是静态类型语言并支持类型,允许维护正确性与性能的同时保持源代码的简洁。
2、Kotlin支持面向对象和函数式两种编程风格,通过头等函数使更高级别的抽象成为可能,通过支持不可变值简化了测试和多线程安全。
3、在服务器端应用程序中它工作的很好,全面支持所有现存的Java框架,为常见的任务提供了新工具,如生成HTML和持久化。
4、在Android上它也可以工作,这得益于紧凑的运行时、对Android API特殊的编译器支持以及丰富的库,为常见Android开发任务提供了Kotlin友好的函数。
5、他是免费和开源的,全面支持主流的IDE和构建系统。
6、Kotlin时务实的、安全的、简洁的,与Java可互操作,意味着它专注于使用已经证明过的解决方案处理常见任务,
防止常见的像NullPointerException这样的错误,支持紧凑和易读的代码,以及提供于Java无限制的集成。
二).Hello World
fun main(args : Array){
println("Hello World")
}
三).函数
上面看到了怎么声明一个没有返回任何东西的函数。
但如果函数有一个有意义的结果,返回类型应该放在哪里呢:
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 max1(a : Int, b : Int) = if (a > b) a else b
val question = "what are you 弄啥咧?"
val answer = 111111
val answer : Int = 111111
val message : String
if(true){
message = "true"
}else{
message = "false"
}
val languages = arrayListOf("Java")
languages.add("Kotlin")
即使var关键字允许变量改变自己的值,但他的类型却是改变不了的:
var answer = 11111
answer = "wonima"
这就会报错。
4.2更简单的字符串格式化 : 字符串模版
fun main(args : Array){
val name = if(args.isNotEmpty()) args[0] else "Kotlin"
println("Hello, $name")
}
println("Hello, ${args[0]}")
还可以在花括号内直接嵌套双引号,只要他们处在某个表达式的范围内(即花括号内):
println("Hello, ${if (args.isNotEmpty()) args[0] else "Kotlin"}")
public class Personal {
private final String name;
public Personal(String name){
this.name = name;
}
public String getName(){
return this.name;
}
}
class Personal(val name: String)
5.1属性
class Personal(
val name: String, // 只读属性:生成一个字段和一个简单的getter
var isMarried : Boolean // 可读写属性:一个字段、一个getter和一个setter
)
class Rectangle(val height : Int, val width : Int){
val isSquare : Boolean
// 声明属性的getter
get(){
return height == width
}
}
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),
INDIGO(75, 0, 130), VIOLET(238, 130, 238); // 这里必须要有分号
fun rgb() = (r * 256 + g) * 256 + b //给枚举类定义一个方法
}
6.2使用when处理枚举类
fun getMenemonic(color: Color) = // 直接返回一个"when"表达式
when(color){ // 如果颜色和枚举常量相等就返回对应的字符串
Color.RED -> "Richard"
Color.ORANGE -> "Of"
Color.YELLOW -> "York"
Color.GREEN -> "Gave"
Color.BLUE -> "Battle"
Color.INDIGO -> "In"
Color.VIOLET -> "Vain"
}
fun getWarmth(color: Color) =
when(color){
Color.RED, Color.ORANGE, Color.YELLOW -> "Warm"
Color.GREEN -> "neutral"
Color.BLUE, Color.INDIGO, Color.VIOLET -> "cold"
}
fun mix(c1 : Color, c2 : Color) =
when(setOf(c1, c2)){
setOf(Color.RED, Color.YELLOW) -> Color.ORANGE
setOf(Color.YELLOW, Color.BLUE) -> Color.GREEN
setOf(Color.BLUE, Color.VIOLET) -> Color.INDIGO
else -> throw Exception("Dirty color")
}
fun mixOptimized(c1 : Color, c2 : Color) =
when{
(c1 == Color.RED && c2 == Color.YELLOW) ||
(c1 == Color.YELLOW && c2 == Color.RED) ->
Color.ORANGE
(c1 == Color.YELLOW && c2 == Color.BLUE) ||
(c1 == Color.BLUE && c2 == Color.YELLOW) ->
Color.GREEN
(c1 == Color.BLUE && c2 == Color.VIOLET) ||
(c1 == Color.VIOLET && c2 == Color.BLUE) ->
Color.INDIGO
else -> throw Exception("Dirty color")
}
while (true){
// 当条件为true时执行循环体
}
do {
}while (true) // 循环第一次会无条件执行。此后当条件为true时才执行
7.1迭代数字:区间和数列
fun fizzBuzz(i : Int) = when{
i % 15 == 0 -> "FizzBuzz"
i % 3 == 0 -> "Fizz"
i % 5 == 0 -> "Buzz"
else -> "$i "
}
>>> for(i in 1..100){ print(fizzBuzz(i)) }
for(i in 100 downTo 1 step 2){
print(fizzBuzz(i))
}
// 使用TreeMap让键排序
val binaryReps = TreeMap()
// 使用字符区间迭代从A到F之间的字符
for (c in 'A'..'F'){
// 把码转换成二进制
val binary = Integer.toBinaryString(c.toInt())
// 根据键c把值存储到map中
binaryReps[c] = binary
}
// 迭代map,把键和值赋给两个变量
for ((letter, binary) in binaryReps){
println("$letter = $binary")
}
val list = arrayListOf("10", "11", "1001")
for ((index, element) in list.withIndex()){
println("$index: $element") // 迭代集合时使用下标
}
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..."
}
八).Kotlin中的异常
val percentage =
if (number in 0..100)
number
else
throw IllegalArgumentException("xxxxxxxxx")
8.1"try","catch"和"finally"
fun readNumber(reader : BufferedReader) : Int?{ // 不必显示的指定这个函数能抛出的异常
try {
val line = reader.readLine()
return Integer.parseInt(line)
}
catch (e : NumberFormatException){ // 异常类型在右边
return null
}
finally { // 和java中的finally作用一样
reader.close()
}
}