data class Custom(val name:String,val email:String)
一般情况下如果函数的参数都有默认值
//下面两种方法的效果是等同的
fun foo(x: Int = 0, y: String = "") {
println("$x is $y")
}
fun fzz(x: Int, y: String) {
println("$x is $y")
}
fun main(args: Array) {
foo(3, "three")
fzz(4, "four")
}
一般情况下,集合使用filter方法对数据进行过滤。
val list = listOf(1, 3, 4, 5, 6, 7, 8, 9, 10)
//两种实现方式是等同的
val positives = list.filter { x -> x > 5 }
val positives2 = list.filter { it > 5 }
fun main(args: Array) {
println(positives.forEach { print(it) })
println(positives2.forEach { print(it) })
String内插,就是将变量插入到String字符串中,通过 $ 符号将变量插入。
fun person(name: String, age: Int) {
println("name-->$name,age-->$age")
}
fun main(args: Array<String>) {
person("张三", 24)
}
对变量的类型进行判断,通过字符 is,判断其是否为某种类型。
fun type(x: Any) {
when (x) {
is Number -> println("$x is Number")
is String -> println("$x is String")
else -> println("don't know type")
}
}
fun main(args: Array) {
type(3)
type("Hello")
type('c')
}
map型的集合是有key-value对应值的,通过for循环对其遍历输出。
fun print(x: HashMap<String, String>) {
for ((k, v) in x) {
println("key -->$k,value-->$v")
}
}
fun main(args: Array<String>) {
val items = hashMapOf("a" to "apple", "b" to "banana", "o" to "orange")
print(items)
}
区间的判断,一般使用 in 对数据进行判断, 判断其是否在某个区间内。
一般来说,区间的范围,有几种表现形式:
fun main(args: Array) {
for (i in 1..10) {
print("$i ")
}
println()
//左闭右开区间
for (i in 1 until 5) {
print("$i ")
}
println()
for (i in 2..10 step 2) {
print("$i ")
}
println()
for (i in 10 downTo 1) {
print("$i ")
}
println()
val i = 3
if (i in 1..10) {
print("$i ")
}
}
fun main(args: Array<String>) {
//定义为只读map
val map = mapOf("a" to "apple", "b" to "banana", "o" to "orange")
//访问所有的key值
map.keys.forEach { println(it) }
//访问所有的value值
map.values.forEach { print(it) }
//访问key = a 的value值
println(map["a"])
}
在函数的基础上,对其进行扩展,增加自己想要的功能。比如扩展这样一个功能:对任意的对象转换为字符串功能。
fun Any?.changeToString(): String {
return if (this == null) "null"
else return toString()
}
fun main(args: Array<String>) {
var name = 'c'
var age = 22
println(name.changeToString())
println(age.changeToString())
}
对象和调用的方法之间添加 ?,就是对其进行不为空判断。
val files = File("Test").listFiles()
println(files?.size)
在判断完之后添加 :,就是else的内容。
val files = File("Test").listFiles()
println(files?.size ?: "没有此文件")
通过 ?:,后面为null之后所执行的语句
val values = mapOf("a" to "apple", "e" to "email")
val email = values["email"] ?: throw IllegalAccessException("Email is Missing")
println(email)
通过 ?.let{},如果为null就行let{ }里面的代码
val value = "163.com"
value?.let {
println("已经查找到Email,地址为:" + it)
}
通过return when(){},通过不同条件返回不同结果。
fun transform(color: String): Int {
return when (color) {
"RED" -> 0
"GREEN" -> 2
"BLUE" -> 3
else -> throw IllegalAccessException("no have this color")
}
}
fun main(args: Array<String>) {
println(transform("GREEN"))
}
try-catch抛异常执行相应操作。
fun test(age: Int): Any? {
val result = try {
age < 10
} catch (e: ArithmeticException) {
throw IllegalAccessException(e.toString())
}
return result
}
fun main(args: Array<String>) {
println(test(10))
}
通过对不同条件的判断,输出不同的结果。
fun foo(param: Int) {
if (param == 1) {
println("one")
} else if (param == 2) {
println("two")
} else {
println("three")
}
}
fun main(args: Array) {
foo(2)
}
如果一个函数的返回结果很简单,也可以直接写成单表达式。
同时,单表达式函数与其他惯用法一起使用,简化代码,例如和when一起使用。
//两种方式是等同的
fun theAnswer() = 42
fun theAnswer2(): Int {
return 42
}
//单表达式函数与when一起使用
fun transform2(color: String): Int = when (color) {
"RED" -> 0
"GREEN" -> 1
"BLUE" -> 2
else -> throw IllegalAccessException("don't have this color")
}
fun main(args: Array<String>) {
println(theAnswer())
println(theAnswer2())
println(transform2("RED"))
}
当一个对象想要调用多个方法时,可以使用with(){},在()内填入对象,在{}内依次填入需要调用的方法。
class Turtle {
fun penDown() {}
fun penUp() {}
fun turn(degree: Double) {}
fun forward(pixels: Double) {}
}
fun main(args: Array<String>) {
val myTurtle = Turtle()
with(myTurtle) {
penDown()
for (i in 1..4) {
forward(100.0)
turn(90.0)
}
penUp()
}
}
fun ftt(b: Boolean?) {
if (b == true) {
println("true")
} else {
print("false or null")
}
}
fun main(args: Array<String>) {
idiomatic_usage.ftt(true)
ftt(null)
}