廊坊企业网站团队,莱芜做网站,杭州网站建设公司电话,指数基金Hello word 前言#xff1a;上次学习安卓#xff0c;学了Java开发#xff0c;简单的搭了几个安卓界面。这次要学习Kotlin语言#xff0c;然后开发安卓#xff0c;趁着还年轻#xff0c;学点新东西#xff0c;坚持~ 未来的你会感谢现在努力的你~ 主要学习资料#xff1a…Hello word 前言上次学习安卓学了Java开发简单的搭了几个安卓界面。这次要学习Kotlin语言然后开发安卓趁着还年轻学点新东西坚持~ 未来的你会感谢现在努力的你~ 主要学习资料
《第一行代码Android 第三版》菜鸟教程android官网-kotlinKotlin 官方文档 中文版2018年黑马安卓开发视频教程
那么开始吧~
开始-Kotlin语言-安卓开发学习
首先是搭建环境在一通操作过后在android studio上成功安装行了kotlin 经典的hello word eclipse环境搭建结果 参数
又是一个绕不开的话题 kotlin中 使用val修饰的变量是不可变的(value) 使用var修饰的变量是可变的variable 可变的
tips: 优先使用val来声明一个变量而当val没有办法满足你的需求时再使用var 函数的格式
kotlin:
func 函数名(参数名 参数类型): 返回值类型{函数体
}oc:
- (返回值类型)函数名(参数类型: 参数名) {函数体
}只是组合方式不一样 函数的四要素函数名、参数、返回值类型、函数体都有
函数的简略写法
fun sum(a: Int, b: Int): Int{return ab
}
//如果函数体里面只有一条语句而且该语句有返回值则可以去掉{}并省略return直接使用
fun sum2(a: Int, b: Int): Int ab在kotlin中函数和参数(变量)一样都是一等公民 那个也可以将函数表达式赋值给一个变量 ///等号右边称为函数表达式var i {a: Int, b: Int - ab}println(i(3, 8))还有另外一种写法 //var j:后面表面是一种类型j是一个函数类型两个入参一个出参//后面是一个函数表达式var j:(Int, Int)-Int {x, y - xy }println(j(1, 8))也就是函数也可以充当函数里面的参数或者返回值
for循环
kotlin也有swift中的开区间、闭区间的概念 四种类型[]()[)(] 注意所谓 “全开区间” 或者是 “左开右闭” 的区间可以用其他两种方式代替 var nums 1..10for (num in nums){print($num, )}println()var nums2 1 until 10for (num in nums2){print($num, )}运行结果 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, step n隔几个打印1个 for (num in 1..20 step 2){print($num, )}运行结果1, 3, 5, 7, 9, 11, 13, 15, 17, 19, reversed()翻转打印 var nums2 1 until 10for (num in nums2.reversed()){print($num, )}运行结果9, 8, 7, 6, 5, 4, 3, 2, 1, list和map
使用listOf创建一个list 使用witIndex()获取index的值然后使用(x, y)两个参数接收 fun main(args: ArrayString){var array listOfString(1, 2, 4, 9)for ((i, e) in array.withIndex()){println($i $e)} 运行结果 0 1 1 2 2 4 3 9 //导入TreeMap包
import java.util.TreeMapfun main(args: ArrayString){//创建一个mapvar map2 TreeMapString, String()//赋值map2[good] 好map2[bad] 坏map2[study] 学习println(map2[bad])
}默认参数与具名参数
val PI 3.14ffun main(args: ArrayString){//要写3.14f,3.0f而不是3.14,3var temp circleArea(3.14f, 3.0f)var temp2 circleArea(radius 3.0f)println(temp)println(temp2)
}//圆的面积
//默认Pi的值是PI
//通过在类型的后面添加 符号来设置参数的默认值。
fun circleArea(Pi: Float PI, radius: Float): Float{return Pi*radius*2
}readLine()
readLine()获取键盘输入的字获取后是String?类型的
异常捕获try-catch
举个计算器
fun main(args: ArrayString){println(请输入第一个数字)var a readLine()while (a null || a?.count() 0){println(不能输入空值请重新输入数字)a readLine()}println(请输入第二个数字)var b readLine()while (b null || b?.count()0){println(不能输入空值请重新输入数字)b readLine()}try {var num1 a!!.toInt()var num2 b!!.toInt()var result sum(num1, num2)println($num1 $num2 $result)}catch (error: java.lang.Exception){println(error)}
}fun sum(a: Int, b: Int):Int{return ab
}递归
举个例子计算n的阶层 5的阶层 5 * 4 * 3 * 2 * 1 120 fun main(args: ArrayString){println(jieCeng(5))
}fun jieCeng(a: Int):Int{//结束条件if (a 1) return 1//递归计算return a * jieCeng(a-1)
}尾递归计算
fun main(args: ArrayString){var result 0println(add(100, result))
}tailrec fun add(a: Int, result: Int):Int{println(计算机第${a}次计算 result${result})//结束条件if (a 0) return 1//递归计算return add(a-1, result a)
}继承
如果想继承某个父类则父类class前需要加open允许被继承如果想重写父类的某个方法则子类在同名方法前加overrid且父类在方法前加open允许被重写
接口和抽象类
接口是事物的能力接口用的时候接口名即可抽象类是事物的本质抽象类用的时候抽象类()
代理和委托
A委托B去做某事情 B代理A去做某事情
使用by 类名A()就可以实现类名A里面的方法 open class Father: IWashBowl by Son(){/**override fun wash() {println(我是爸爸洗完一次10元)}* */}//或者这样调用
open class Father: IWashBowl by Son(){override fun wash() {println(我是爸爸我收了妈妈的10元)Son().wash()println(我是爸爸我不洗碗但是赚了9元)}
}单例
创建类的时候不使用class修饰而且使用object修饰则只有一份
印章类sealed
sealed:封闭的、密封的
sealed class更在意类型枚举更在意数据
//跟enum类似只有指定有限的类
sealed class Son {//记得加()class XXL(): Son()class XXM(): Son()fun sayHello(){println(hello)}
}fun main(args: ArrayString){//记得加()才是对象var son1:Son Son.XXL()var son2:Son Son.XXM()var son3:Son Son.XXM()var house listOfSon(son1, son2, son3)for (v in house){if(v is Son.XXM){v.sayHello()}}
}
函数式编程
fun main(args: ArrayString){var names listOfString(tom, locy, jack)//forEach函数names.forEach(action haha)//闭包匿名函数names.forEach{a - println(a)}//闭包names.forEach{//默认参数itprintln(it)}
}//函数作为参数前面使用var 参数名
//后面的函数名去掉
var haha fun (name: String):Unit{println(name)
}
Kotlin高阶函数
一个函数被用作参数或者返回值则称为高阶函数
maxBy/minBy
找出数组array里面age最大的item array.maxBy{a.age} 找出数组array里面height最小的item array.minBy{a.height}
返回的是item对象
var item: Object array.maxBy{it.age}filter
过滤找到特定条件的对象集合 好几个条件并列执行
var newArray array.filter{(it.age18) and (it.height168) and (it.age25)
}map
把原数组某个属性映射成新的集合 比如把人群中的名字列出来放入新的集合中
var newArray oldArray.map{${it.name} : ${it.age}
}结果{name1: 18, name2: 30, name3: 19} any
是否有满足某个条件的对象 返回的是一个boolean值
var temp: Boolean array.any{it.age 18
}count
统计符合满足条件对象的个数
var count: Int array.count{it.age18
}find
查找符合条件的对象并返回第一个
var item: Object array.finc{it.address北京
}groupBy
按照特征把对象分为不同的组
var result: Array array.groupBy{it.address
}按照地址把原来的数组分别组成新的数组
DSL 领域特定语言
扩展函数中缀表达式 函数使用infix修饰后.的操作可以换成空格的操作