包的定义与导入:
package com.example.ljy.kotlin001
import java.math.BigDecimal
- 如果出现名字冲突,可以使⽤ as 关键字在本地重命名冲突项来消歧义:
import android.os.Message
import android.app.Notification.MessagingStyle.Message as NotifiMessage
程序⼊⼝点
fun main() {
println("Hello world!")
}
注释
变量与常量
- 声明:var/val关键字 变量名 :变量类型
var aaa: Int=0
val bbb =1
- 可变变量定义:var 关键字
var x = 5
x += 1
- 不可变变量定义:val 关键字,只能赋值一次的变量
- 类似Java中final修饰的变量
- 优先使⽤不可变数据
val a: Int = 0
val b = 1
val c: Int
c = 2
数字:
- 常用类型: Byte,Short,Int,Long,Float,Double
- 常用进制
var num1=123
var num2=0x2f
var num3=0b00001011
val oneMillion = 1_000_000
- 与⼀些其他语⾔不同,Kotlin 中的数字没有隐式拓宽转换。
例如,具有 Double 参数的函数只能对 Double
值调⽤,⽽不能对 Float 、 Int 或者其他数字值调⽤
fun printDouble(d: Double) {
println(d)
}
val n1 = 1
val n2 = 1.1
val n3 = 1.1f
printDouble(n2)
val a: Int = 100
val boxedA: Int? = a
val anotherBoxedA: Int? = a
val b: Int = 10000
val boxedB: Int? = b
val anotherBoxedB: Int? = b
println(boxedA === anotherBoxedA)
println(boxedB === anotherBoxedB)
println(b == b)
println(boxedB == anotherBoxedB)
val a1: Int? = 1
val b1: Long? = a1?.toLong()
println(b1?.equals(a1) ?: (a1 == null))
val x1 = 5 / 2
println("x1 == 2:${x1 == 2}")
val x2 = 5 / 2.toDouble()
println("x2 == 2.5:${x2 == 2.5}")
val x3 = 5.toDouble() / 2
println("x3 == 2.5:${x3 == 2.5}")
- 位运算:对于位运算,没有特殊字符来表⽰,⽽只可⽤中缀⽅式调⽤具名函数
val x = (1 shl 2) and 0x000FF000
与其⾃⾝相等
println("Float.NaN== Float.NaN:${Float.NaN == Float.NaN}")
println("Float.NaN=== Float.NaN:${Float.NaN === Float.NaN}")
println("Float.NaN.equals( Float.NaN):${Float.NaN.equals(Float.NaN)}")
println("Float.NaN - Float.POSITIVE_INFINITY: ${Float.NaN - Float.POSITIVE_INFINITY}")
//-0.0 ⼩于 0.0
println("-0.0 ⼩于 0.0:${-0.0 < 0.0}")
数组在 Kotlin 中使⽤ Array 类来表⽰,它定义了 get 与 set 函数
(按照运算符重载约定这会转变为 [])以及size 属性,以及⼀些其他有⽤的成员函数
val asc = Array(5) { i -> (i * i).toString() }
asc.forEach { println(it) }
val aar: IntArray = intArrayOf(1, 2, 3)
aar[0] = aar[1] + aar[2]
// ⼤⼩为 5、值为 [0, 0, 0, 0, 0] 的整型数组
val arr1 = IntArray(5)
// 例如:⽤常量初始化数组中的值
// ⼤⼩为 5、值为 [42, 42, 42, 42, 42] 的整型数组
val arr2 = IntArray(5) { 42 }
var arr3 = IntArray(5) { it * 1 }
val b: UByte = 1u
val s: UShort = 1u
val l: ULong = 1u
val a1 = 42u
val a2 = 0xFFFF_FFFF_FFFFu
val a = 1UL
字符串模版
- 优先使⽤字符串模板⽽不是字符串拼接
- 优先使⽤多⾏字符串⽽不是将 \n 转义序列嵌⼊到常规字符串字⾯值中
- 模版中的简单名称(省略花括号)
var num = 101
val s1 = "num is $num"
println(s1)
- 模版中的任意表达式
num = 102
val s2 = "${s1.replace("is", "was")},but now is $num"
println(s2)
- 多行字符串
//如需在多⾏字符串中维护缩进,
// 当⽣成的字符串不需要任何内部缩进时使⽤ trimIndent,
// ⽽需要内部缩进时使⽤trimMargin :
val a1 =
"""
Foo
Bar
""".trimIndent()
println("a1:\n$a1")
val a2 = """if(a > 1) {
| return a
|}""".trimMargin()
println("a2:\n$a2")
- 字符串的元素⸺字符可以使⽤索引运算符访问
for (c in s1) {
println(c)
}
- 字符串字⾯值:(两种)
//1. 转义字符串: 可以有转义字符
val s = "Hello, world!\n"
//2. 原始字符串: 使⽤三个引号( """ )分界符括起来
val text = """
for (c in "foo")
print(c)
"""
条件表达式和循环表达式
if (num > 0) {
println(num)
} else {
println("num < 0")
}
val data = mapOf("name" to "ljy", "email" to null)
data["name"] ?: println("name is null")
data["email"] ?: println("email is null")
println("name len = ${data["name"]?.length}")
println("email len = ${data["email"]?.length}")
println(data["name"]?.length ?: "empty")
println(data["email"]?.length ?: "empty")
fun maxOf(a: Int, b: Int) = if (a > b) a else b
val num = maxOf(a, b)
val max1 = if (a > b) {
print("Choose a")
a
} else {
print("Choose b")
b
}
fun describe(obj: Any) =
when (obj) {
1 -> "one"
"Hello" -> "greeting"
0, 2 -> "obj == 0 or obj == 2"
in 1..10 -> "obj is in the range"
is Long -> "Long"
!is String -> "not a string"
else -> "Unknown"
}
println("-->${describe(1)}")
println("-->${describe("Hello")}")
println("-->${describe(1L)}")
println("-->${describe(321)}")
println("-->${describe("abc")}")
val items = listOf("a", "ca", "ac", "bb", "ab", "ba", "c")
for (item in items)
println("for-->$item")
for (index in items.indices)
println("for-->item at $index is ${items[index]}")
for ((index, value) in items.withIndex()) {
println("the element at $index is $value")
}
loop@ for (i in 1..100) {
for (j in 1..100) {
if (i + j == 200) break@loop
}
}
fun foo() {
listOf(1, 2, 3, 4, 5).forEach {
if (it == 3) return
print(it)
}
println("this point is unreachable")
}
fun foo2() {
listOf(1, 2, 3, 4, 5).forEach lit@{
if (it == 3) return@lit
print(it)
}
print(" done with explicit label")
}
fun foo3() {
listOf(1, 2, 3, 4, 5).forEach {
if (it == 3) return@forEach
print(it)
}
print(" done with implicit label")
}
fun foo4() {
listOf(1, 2, 3, 4, 5).forEach(fun(value: Int) {
if (value == 3) return
print(value)
})
print(" done with anonymous function")
}
fun foo5() {
run loop@{
listOf(1, 2, 3, 4, 5).forEach {
if (it == 3) return@loop
print(it)
}
}
print(" done with nested loop")
}
var index = 0
while (index < items.size) {
println("while-->item at $index is ${items[index]}")
index++
}
var index2 = 0
do {
println("while-->item at $index2 is ${items[index2]}")
index++
} while (index2 < items.size)
使用区间(range)
num = 100
if (num !in 0..10) {
println("num 不在0~10范围内")
}
val max = 100
if (num in 1..max + 1) {
println("num 在1~101范围内")
}
if (num in 1 until max) {
println("num 在1~99范围内")
} else {
println("num 不 在1~99范围内")
}
for (it in 1..10) {
println("x = $it")
}
for (y in 1..10 step 2)
println("y = $y")
for (z in 9 downTo 0 step 3)
println("z = $z")
其他
fun printNums(vararg numArr: Int, userName: String?) {
for (n in numArr) {
println("numArr-->$n")
}
if (userName != null)
println("userName--->$userName")
}
printNums(num, userName = null)
fun getStringLength(obj: Any): Int? {
if (obj is String) {
return obj.length
}
return null
}
val len = getStringLength(s1)
println("$s1<--len-->$len")
typealias MouseClickHandler = (Any, MouseEvent) -> Unit
typealias PersonIndex = Map<String, Person>
//相当于:if(p==null) { p=1+2+3+4+5 }, 且是第一次用到时才加载
val p: Int by lazy {
1 + 2 + 3 + 4 + 5
}
println("p --> $p")
fun String.add(s: String): String {
return "$this$s"
}
println("abc".add("def"))
object StrConfig {
const val name = "Mr.L"
var s = "str"
}
println(StrConfig.name)
println(StrConfig.s)
fun test(): Int {
var result = try {
12 / 0
} catch (e: Exception) {
-1
}
return result
}
println("result=${test()}")
data class Person(val name: String, var email: String)
fun Person.sayHi() {
println("$name say: Hello World")
}
val person = Person("ljy", "123456@qq.com")
with(person)
{
val s = toString()
println(s)
hashCode()
println(name)
println(email)
sayHi()
}
person.email = "aaa"
public final class Gson {
......
public <T> T fromJson(JsonElement json, Class<T> classOfT) throws JsonSyntaxException {
......
inline fun <reified T: Any> Gson.fromJson(json: JsonElement): T
= this.fromJson(json, T::class.java)
val bol: Boolean? = null
if (bol == true) {
println("bol = true")
} else {
println("`bol` 是 false 或者 null ")
}
fun testTODO(): BigDecimal = TODO("waiting for feedback from accounting")
@Target(AnnotationTarget.PROPERTY)
annotation class JsonExclude
@JsonExclude @JvmField
var x: String
@Test fun foo() { }
@file:JvmName("FooBar")
package foo.bar
我是今阳,如果想要进阶和了解更多的干货,欢迎关注公众号”今阳说“接收我的最新文章