结合上篇文章,kotlin里面的range使用..来表示,java中的range一般是前闭后开,kotlin中的则不一样,2..8是表示2到8,也包含8,首先我们看个例子
val a = 5
val b = 10
if (a in 2..b) {
println("in the range")
}
if (a !in 2..b) {
println("out of the range")
}
println("------")
for (i in 2..10) {
println(i)
}
println("------")
for (i in 2.rangeTo(10)) {
println(i)
}
println("------")
//步进
for (i in 2..10 step 2) {
println(i)
}
println("------")
//10-2 步进4
for (i in 10 downTo 2 step 4) {
println(i)
}
第一个跟第二循环表示的意思相同,第三个通过step来进行步进,第四个则是反过来步进,很直观
java8中stream操作一个数组很方便,那么在kotlin中是什么样的呢,我们看如下例子
fun main(args: Array<String>) {
var array = listOf<String>("hello", "world", "hello world", "welcome", "bye")
for (item in array) {
println(item)
}
println("------")
when {
"world" in array -> println("world in collection")
}
//找出长度超过5 字符串大写,默认字符排序,打印控制台 awsome
array
.filter { it.length > 5 }
.map { it.toUpperCase() }
.sorted().forEach { println(it) }
}
1.找出集合里面的world 使用when表达式 替代了传统的if,这个跟之前的when的使用又不一样
2.实现的流的操作,比之java8的语法更加优雅, it代表lambda表达式的入参
最后一个例子是写class的,跟java中做对比
class EmptyClass
如果往class前面添加public也是可以的,但是编辑器提醒public是多余的,说明默认class就是public的,加不加都可以,其次java中要求public class 类名跟文件名保持一致,在kotlin中没有这样的规定,如果类中什么也没有,可以不带花括号
在看下面
class MyClass constructor(userName : String){
private val userName: String = userName.toUpperCase()
init {
println(userName)
}
}
fun main(args: Array<String>) {
val myClass: MyClass = MyClass("zhangsan")
}
1.在kotlin中,一个类可以有个primary构造方法以及一个或者多个secondary构造方法
2.primary构造方法是类头(class head) 的一部分,它位于类名后面,可以拥有若干参数
3.如果primary构造方法没有任何注解或者可见性关节字修饰,那么constructor关键字可以省略
4.初始化MyClass,省略了new关键字
上面的例子可以看到init代码块其实就是类似之前java构造方法的逻辑,这里构造方法,跟初始化构造方法逻辑做了拆分,构造方法要么用于初始化成员变量,要么用于init代码块逻辑,如上面例子,上面例子运行结果
zhangsan