概述

之前介绍了kotlin的快速入门,http://www.cnblogs.com/lizo/p/7231167.html 大多数还是参照java。kotlin中提供了更多更方便的语言特性

这个方言其实是针对java而言,因为很多用法其实在其他语言里面是已经存在的。使用kotlin的这些方言能够在一定程度上提高你的开发效率

POJO类

在kotlin中定义class时候加上关键字data即可创建

//注意声明对象的成员变量的是加上val关键字
data class Persion(val name: String, val age: Int)

这种对象包含的方法有

  • getter和setter方法
  • equals()
  • hashCode()
  • toString()
  • copy()
  • 组成方法

组成方法

组成方法就是可以快速获取data对象方法,例如

data class Person(val name:String ,val age:Int)

fun main(args: Array<String>) {
var p = Person("lizo",18);
println(p.component1()) //获取第一个成员变量
println(p.component2()) //获取第二个成立变量 var (name,age) = p; //把第一个和第二个变量分别赋值给 name 和age ,注意是根据顺序,而不是名字
println("name : $name ,age : $age")
}

输出

lizo
18
name : lizo ,age : 18

应用场景

例如使用一个方法返回多个参数的时候,就可以使用这个方法

data class Persion(val name: String, val age: Int)
fun someCall():Person{
...
return Person("lizo",18)
} val (name,age) = someCall()

方法默认值

在调用某些方法的时候,我们需要可以设置一些默认值

fun someCall(var1: String, var2: Int, var3: String = "default"){
print("$var1,$var2,$var3")
} fun main(args: Array<String>) {
someCall("lizo",18)
}

在一个方法阿尤多个默认值的时候,可以选择性的赋值(但没有默认值的参数必须传递)

fun someCall(var1: String = "default1", var2: Int, var3: String = "default2") {
print("$var1,$var2,$var3")
} fun main(args: Array<String>) {
someCall(var2 = 18,var3 = "lizo123")
}

类型判断

利用when的语法,进行实例类型判断

when(a){
is String -> print(a.length)
is Int -> print(a)
...
else -> throw RuntimeException();
}

遍历list/map

for (l in list) {
println("$l")
} for ((k, v) in map) {
println("$k -> $v")
}

使用数字区间

for (i in 1..100) { ... }  // 闭区间:包含100
for (i in 1 until 100) { ... } // 不包含100
for (x in 2..10 step 2) { ... } // 按照步长为2增长
for (x in 10 downTo 1) { ... } //
if (x in 1..10) { ... } //判断x是否在1到10这个区间内

只读map和list

val list = listOf("a", "b", "c")
val map = mapOf("a" to 1, "b" to 2, "c" to 3)

访问map元素

println(map["key"]) //get
map["key"] = value //set

延迟加载

有些属性我们希望可以延迟加载,可以是用 by lazy属性(必须是val修饰的变量)

class Clazz() {
val p: String by lazy {
println("lazy!")
"haha"
}
} fun main(args: Array<String>) {
var clazz = Clazz()
println(clazz.p)
println(clazz.p)
}

输出

lazy!
haha
haha

类扩展方法

kotlin中支持对一个类的方法进行扩展

fun String.myToLowerCase(): String {
return this.toLowerCase()
} fun main(args: Array<String>) {
println("tHIs iS TeST".myToLowerCase())
}

输出

this is test

这样做的好处就是在我们需要扩展某个类的方法时候,不用定义一个新的类去扩展,不好的地方一个类的扩展类也许或分布在多个地方。

null处理

在编码过程中很多地方都用到了对null处理,kotlin中提供了便捷操作方法去处理

    //如果a为null,则整个a?.length都是null
print(a?.length);

如果需要在为null的情况下赋值

//当a为null的时候,b的值为default
var b = a?:"default"

如果需要判断当a不为null 到时候进行一些处理

a?.let{
//do some thing a != null
}

根据条件判断语句赋值

赋值(=)的时候,可以直接在后面放入条件语句

var a = if(b > 0){1}else{-1}

val c = when (d){
"red" -> 1
"blue" -> 2
else -> throw IllegalArgumentException("Invalid color param value")
}
} //函数返回
fun someCall(a:Int) = if(a>0){1}else if(){-1}

当用到一个对象的多个方法时候

通过使用with关键字,可以在范围内直接调用该方法

class Turtle {
fun penDown()
fun penUp()
fun turn(degrees: Double)
fun forward(pixels: Double)
} val myTurtle = Turtle()
with(myTurtle) { //draw a 100 pix square
penDown()
for(i in 1..4) {
forward(100.0)
turn(90.0)
}
penUp()
}

最新文章

  1. 解决UITableView上计时器(Timer)的滑动问题
  2. PHP模拟登录并获取数据
  3. fastReport 运行时设计报表 (mtm)
  4. 聊聊CSS postproccessors
  5. :first与:first-child的区别
  6. php返回状态200或者300的写法
  7. 微软免费TFS如何设置在客户端独占签出
  8. HDU 4276 The Ghost Blows Light(树形)
  9. SpringMvc学习-增删改查
  10. 设计模式6:Composite
  11. 【T】并行调度
  12. 浏览器仿EXCEL表格插件 版本更新 - 智表ZCELL产品V1.3.2更新
  13. HAProxy 的acl应用
  14. 51Nod 1264 线段相交(计算几何)
  15. 洗礼灵魂,修炼python(17)--跨平台操作三剑客—os,os.path.sys模块
  16. 17秋 软件工程 团队第五次作业 Alpha Scrum1
  17. 第三方登录:新浪微博登录(OAuth2.0)
  18. shell学习(三)
  19. input 文件上传
  20. 恢复xfs文件系统superblock实验

热门文章

  1. 来腾讯云开发者实验室 学习.NET Core 2.0
  2. 轻松上云,从容实施Office 365项目
  3. JavaScript 实现命名空间(namespace)的最佳方案——兼容主流的定义类(class)的方法,兼容所有浏览器,支持用JSDuck生成文档
  4. 掀起Azure AD的盖头来&mdash;&mdash;深入理解Microsoft Graph应用程序和服务权限声明
  5. path和classpath细节
  6. 自学Zabbix3.5.5-监控项item-User parameters(自定义key)
  7. 自学Zabbix之路
  8. div元素宽度不定的情况下如何居中显示
  9. 在Office Add-in中实现单点登陆(SSO)
  10. JavaScript 数组最大值