Kotlin基础 (五)
41_kotlin面向对象-枚举
枚举 — enum
枚举:一一列举
使用枚举可以使代码变得更加的可读,更容易理解
示例代码:
// 枚举练习
// 使用枚举可以使代码变得更加的可读,更容易理解
enum class Week{
星期一,星期二,星期三,星期四,星期五,星期六,星期日
}
fun main(args: Array<String>) {
// ordinal 为顺序 (星期一为 0)
println(Week.星期日.ordinal)
}
42_kotlin面向对象-密封类
Sealed Class
子类类型有限的class
印章类和枚举的区别
Sealed Class更在意类型
枚举更在意数据
// 如果是采用下面的写法 ( var s:Son = Son() )
// sealed class Son:因为 Son 类前面加了 sealed 关键字,加上 sealed 关键字后不可以直接实例化 Son 类
// 密封类 Son 是没有 构造方法的
//var s:Son = Son()
创建一个 sealed class文件: Son
示例代码:
// 印章类(密封类)
/*
* 小母驴,小公驴,小公马生下来的儿子
*/
// 能够指定个数类 类型
sealed class Son {
fun sayHello(){
println("大家好!")
}
class xiaolv():Son()
class xiaoluozi():Son()
}
创建一个 File 文件: Test
示例代码:
fun main(args: Array<String>) {
// 定义一个变量,指定其类型为 Son 类型
// 如果是采用下面的写法 ( var s:Son = Son() )
// sealed class Son:因为 Son 类前面加了 sealed 关键字,加上 sealed 关键字后不可以直接实例化 Son 类
// 密封类 Son 是没有 构造方法的
//var s:Son = Son()
// 定义一个变量,指定其类型为 Son 类型
var s1:Son = Son.xiaoluozi()
var s2:Son = Son.xiaolv()
var s3:Son = Son.xiaolv()
// 将变量装进 集合里面
var list = listOf<Son>(s1,s2,s3)
// 遍历
for (v in list){
if (v is Son.xiaolv){
v.sayHello()
}
}
}
43_kotlin后续录制计划(没有知识点)
44_kotlin闭包(closure)
闭包Closure
让函数成为编程语言中的一等公民
让函数具有对象所具有的能力(封装)
让函数具有状态
Java编程语言和kotlin编程语言的区别
Java编程语言
函数(Java中的二等公民)
二等公民就是有很多的权利受到了限制
案例:
public class Test {
//(函数和方法) 二等公民只能在类里面出现
// Java语言把函数作为二等公民,二等公民不可以出现在函数里面的,它只能出现在类的定义里
public void test(){
}
}
上图为Java语言
普通的Java语言传递一个参数(这个参数只能是一等公民、只能是数据类型)
输入的为数据
输出的也为数据
kotlin编程语言
函数(kotlin中的一等公民)
案例:
// kotlin语言中函数为一等公民,函数可以像定义变量一样定义在函数的内部
// 函数变成一等公民之后有什么好处呢?
// 1、在函数的内部可以声明函数了
// 2、函数的参数可以是函数了,函数的返回值也可以是函数了
// kotlin语言:函数式编程语言
fun test() {
var a = 3
a++
println(a)
}
fun main(args: Array<String>) {
// 普通的函数是不协带状态的,每调用一次 test() 方法,test() 方法一旦执行完毕之后里面所有的内容都会被释放掉
// 所以下面写三个相同的方法 打印出来的值均为 4
test()
test()
test()
}
上图的解析:Kotlin里函数作为了一等公民,我们一个函数可以关联一组数据交给一个函数处理,这个函数处理完毕之后可能会产生一个新的函数
kotlin语言中函数为一等公民,函数可以像定义变量一样定义在函数的内部函数变成一等公民之后有什么好处呢?
1、在函数的内部可以声明函数了
2、函数的参数可以是函数了,函数的返回值也可以是函数了
kotlin语言:函数式编程语言
什么是闭包?
在函数里面嵌套函数,这样的代码就是闭包
fun test(){
var a = 3
fun test2(){
}
}
函数的返回值为函数,这样的代码就是闭包
练习代码示例:
// 普通的函数是不协带状态的,每调用一次 test() 方法,test() 方法一旦执行完毕之后里面所有的内容都会被释放掉
fun test() {
var a = 3
a++
println(a)
}
fun main(args: Array<String>) {
// 普通的函数是不协带状态的,每调用一次 test() 方法,test() 方法一旦执行完毕之后里面所有的内容都会被释放掉
// 所以下面写三个相同的方法 打印出来的值均为 4
test()
test()
test()
}
输出结果为:4、4、4
而不是:4、5、6
闭包的示例代码:
// 这个 test函数的返回值为一个函数,这个函数接收的参数为空,返回值类型也为空
fun test1():()->Unit {
var a = 3
// 直接返回一个fun
return fun(){
// 这里使用了函数内部的一个成员 var a = 3
a++
println(a)
}
}
fun main(args: Array<String>) {
// 首先定义一个变量 t,这样就拿到了test函数了
var t = test1()
// 这个test()的返回值也是一个函数,那么就可以进行调用里面的逻辑
t()
t()
t()
}
输出结果为:4、5、6
45_kotlin函数式编程入门
OOP:面向对象编程
FP:函数式编程
函数式编程的好处:
函数式编程中函数作为计算机编程语言中的一等公民,函数可以作为参数放到函数里,也可以作为一个输出作为一个返回值返回回去
案例:
传统模式
求解(1 + 2) * 3 – 4
Var a = 1 + 2;
Var b = a * 3;
Var c = b - 4;
函数式编程
Var result = subtract(multiply(add(1,2),3),4);
改写
add(1,2). Multiply(3). subtract(4)
函数式编程的优点
简洁,方便理解
方便程序修改和扩展
练习代码示例:
// (String) -> Unit 参数为函数类型 参数为字符串 返回值为 Unit(空)
fun print(name:String):Unit{
println(name)
}
fun main(args: Array<String>) {
var names = listOf<String>("tom","jerry","lucy")
// 不可以像下面这样去写,因为 forEach() 接收的是一个参数,而 print 是一个函数
names.forEach(print)
}
这样会报错:因为 forEach() 接收的是一个参数,而 print 是一个函数
修改成下面的代码就不会进行报错了!
// (String) -> Unit 参数为函数类型 参数为字符串 返回值为 Unit(空)
// 当给函数指定了一个引用之后,这个函数就不需要名字了
var print = fun (name:String):Unit{
println(name)
}
fun main(args: Array<String>) {
var names = listOf<String>("tom","jerry","lucy")
// 不可以像下面这样去写,因为 forEach() 接收的是一个参数,而 print 是一个函数
names.forEach(print)
}
上面的代码太复杂了,因为 forEach ()是高级函数,所以可以写的更加的简洁
fun main(args: Array<String>) {
var names = listOf<String>("tom","jerry","lucy")
names.forEach{
// 写一个匿名的函数,这个函数的参数为 a 函数的内容为 println()打印出来
//a -> println(a)
// 上面的代码 a -> println(a) 与 println(it)是相同的
println(it)
}
}
46_kotlin图片处理
Bmp图片
BMP文件格式,又称为Bitmap(位图)或是DIB(Device-Independent Device,设备无关位图),是Windows系统中广泛使用的图像文件格式。由于它可以不作任何变换地保存图像 像素域的数据
高级函数就是:
参数或者返回值为函数的函数
创建一个左上角的一点为红色的图片
示例代码:
import java.awt.image.BufferedImage
import java.io.File
import javax.imageio.ImageIO
// 创建一个左上角的一点为红色的图片
// 图片处理 练习Demo
fun main(args: Array<String>) {
// 创建图片
// 在 kotlin 中可以直接使用 Java 的 API
// 在内存中生成一个图片,(三个参数:第一个宽度、第二个高度、第三个图片的类型)
// 在内存中创建一个宽和高维 100 的图片
var image = BufferedImage(100,100,BufferedImage.TYPE_INT_RGB)
// 对图片的每一个点设置一下颜色,设置左上角的一点为红色
image.setRGB(0,0,0xff0000)
// 将图片保存下来
// 第一个参数:为要写的图片
// 第二个参数:为扩展名:为 bmp 类型的
// 第三个参数:为要写到哪个文件里
ImageIO.write(image,"bmp", File("E:\\gongfang\\IdeaKotlinDemo\\TuPianChuLi\\a.bmp"))
}
案例实战:
画 100 * 100 的蓝色纯色图像
画 100 * 100 的红色纯色图像
画 100 * 100 的白色纯色图像
创建一个完整颜色的图片
示例代码:
import java.awt.image.BufferedImage
import java.io.File
import javax.imageio.ImageIO
// 创建一个完整颜色的图片
// 图片处理 练习Demo
fun main(args: Array<String>) {
// 创建图片
// 在 kotlin 中可以直接使用 Java 的 API
// 在内存中生成一个图片,(三个参数:第一个宽度、第二个高度、第三个图片的类型)
// 在内存中创建一个宽和高维 100 的图片
var image = BufferedImage(100,100,BufferedImage.TYPE_INT_RGB)
// 令整个图片为红色
var w = 0 .. 99 // 宽度
var h = 0 .. 99 // 高度
// apply 为{ },所以接收的为函数
image.apply {
for(i in w){
for (j in h){
setRGB(i,j,0xff0000)
}
}
}
// 将图片保存下来
// 第一个参数:为要写的图片
// 第二个参数:为扩展名:为 bmp 类型的
// 第三个参数:为要写到哪个文件里
ImageIO.write(image,"bmp", File("E:\\gongfang\\IdeaKotlinDemo\\TuPianChuLi\\r.bmp"))
}
48_kotlin高阶函数实战(传统函数演示)
案例:非诚勿扰
示例代码:
// 非诚勿扰
data class Girl(var name:String,var age:Int,var height:Int,var address:String)
// 非诚勿扰数据库
var feichengwuraoshujuku = listOf<Girl>(
Girl("依儿",18,168,"山东"),
Girl("笑笑",19,175,"河南"),
Girl("小百合",18,168,"山东"),
Girl("依儿",17,155,"福建"),
Girl("michel",22,148,"广东"),
Girl("猫咪",28,159,"广西"),
Girl("玲儿",23,169,"广东"),
Girl("环环",25,172,"安徽"),
Girl("胖嘟嘟",32,180,"河北"),
Girl("乔乔",35,180,"广东"),
Girl("小可爱",27,150,"江西"),
Girl("一生有你",22,163,"山东"),
Girl("敏儿",28,155,"黑龙江"),
Girl("月儿",25,178,"吉林"),
Girl("花儿",21,183,"山东"),
Girl("S小糖",49,190,"新疆"),
Girl("悦悦",19,160,"广西"),
Girl("小可爱",29,158,"广东"),
Girl("紫琪",49,149,"新疆"),
Girl("糖心",26,165,"甘肃"),
Girl("棒棒糖",23,172,"浙江"),
Girl("猪猪侠",18,173,"山东"),
Girl("喵喵",27,164,"河南"),
Girl("安琦",19,159,"河北"),
Girl("叶子",20,160,"广东")
)
// 根据地区过滤女生
fun filterGirlsByAddress(address: String){
var diqu = ArrayList<Girl>()
for (girl in feichengwuraoshujuku){
if (girl.address == address){
diqu.add(girl)
}
}
for (girl in diqu){
println("${girl.address} ${girl.age}岁的女生 ${girl.name}")
}
}
示例代码:
fun main(args: Array<String>) {
filterGirlsByAddress("河南")
}
49_kotlin高阶函数实战(传统需求实现的缺点)
示例代码:
// 非诚勿扰
data class Girl(var name: String, var age: Int, var height: Int, var address: String)
// 非诚勿扰数据库
var feichengwuraoshujuku = listOf<Girl>(
Girl("依儿", 18, 168, "山东"),
Girl("笑笑", 19, 175, "河南"),
Girl("小百合", 18, 168, "山东"),
Girl("依儿", 17, 155, "福建"),
Girl("michel", 22, 148, "广东"),
Girl("猫咪", 28, 159, "广西"),
Girl("玲儿", 23, 169, "广东"),
Girl("环环", 25, 172, "安徽"),
Girl("胖嘟嘟", 32, 180, "河北"),
Girl("乔乔", 35, 180, "广东"),
Girl("小可爱", 27, 150, "江西"),
Girl("一生有你", 22, 163, "山东"),
Girl("敏儿", 28, 155, "黑龙江"),
Girl("月儿", 25, 178, "吉林"),
Girl("花儿", 21, 183, "山东"),
Girl("S小糖", 49, 190, "新疆"),
Girl("悦悦", 19, 160, "广西"),
Girl("小可爱", 29, 158, "广东"),
Girl("紫琪", 49, 149, "新疆"),
Girl("糖心", 26, 165, "甘肃"),
Girl("棒棒糖", 23, 172, "浙江"),
Girl("猪猪侠", 18, 173, "山东"),
Girl("喵喵", 27, 164, "河南"),
Girl("安琦", 19, 159, "河北"),
Girl("叶子", 20, 160, "广东")
)
// 根据地区过滤女生
fun filterGirlsByAddress(address: String) {
var mougediqu = ArrayList<Girl>()
for (girl in feichengwuraoshujuku) {
if (girl.address == address) {
mougediqu.add(girl)
}
}
for (girl in mougediqu) {
println("${girl.address} ${girl.age}岁的女生 ${girl.name}")
}
}
// 根据年龄过滤女生
fun filterGirlsByAge(age: Int) {
var mougenianling = ArrayList<Girl>()
for (girl in feichengwuraoshujuku) {
if (girl.age < age) {
mougenianling.add(girl)
}
}
for (girl in mougenianling) {
println("${girl.address} ${girl.age}岁的女生 ${girl.name}")
}
}
示例代码:
fun main(args: Array<String>) {
filterGirlsByAge(30)
}
示例代码:
// 非诚勿扰
data class Girl(var name: String, var age: Int, var height: Int, var address: String)
// 非诚勿扰数据库
var feichengwuraoshujuku = listOf<Girl>(
Girl("依儿", 18, 168, "山东"),
Girl("笑笑", 19, 175, "河南"),
Girl("小百合", 18, 168, "山东"),
Girl("依儿", 17, 155, "福建"),
Girl("michel", 22, 148, "广东"),
Girl("猫咪", 28, 159, "广西"),
Girl("玲儿", 23, 169, "广东"),
Girl("环环", 25, 172, "安徽"),
Girl("胖嘟嘟", 32, 180, "河北"),
Girl("乔乔", 35, 180, "广东"),
Girl("小可爱", 27, 150, "江西"),
Girl("一生有你", 22, 163, "山东"),
Girl("敏儿", 28, 155, "黑龙江"),
Girl("月儿", 25, 178, "吉林"),
Girl("花儿", 21, 183, "山东"),
Girl("S小糖", 49, 190, "新疆"),
Girl("悦悦", 19, 160, "广西"),
Girl("小可爱", 29, 158, "广东"),
Girl("紫琪", 49, 149, "新疆"),
Girl("糖心", 26, 165, "甘肃"),
Girl("棒棒糖", 23, 172, "浙江"),
Girl("猪猪侠", 18, 173, "山东"),
Girl("喵喵", 27, 164, "河南"),
Girl("安琦", 19, 159, "河北"),
Girl("叶子", 20, 160, "广东")
)
// 根据地区过滤女生
fun filterGirlsByAddress(address: String) {
var mougediqu = ArrayList<Girl>()
for (girl in feichengwuraoshujuku) {
if (girl.address == address) {
mougediqu.add(girl)
}
}
for (girl in mougediqu) {
println("${girl.address} ${girl.age}岁的女生 ${girl.name}")
}
}
// 根据年龄过滤女生
fun filterGirlsByAge(age: Int) {
var mougenianling = ArrayList<Girl>()
for (girl in feichengwuraoshujuku) {
if (girl.age < age) {
mougenianling.add(girl)
}
}
for (girl in mougenianling) {
println("${girl.address} ${girl.age}岁的女生 ${girl.name}")
}
}
// 根据地区、身高、年龄过滤女生
fun filterGirlsByAddressHeightAge(address: String, height: Int, age: Int) {
var fuhetiaojian = ArrayList<Girl>()
for (girl in feichengwuraoshujuku) {
// 在kotlin 里 如果想要同时满足条件可以使用 And 关键字
if ((girl.age < age) and (girl.address == address) and (girl.height > height)) {
fuhetiaojian.add(girl)
}
}
for (girl in fuhetiaojian) {
println("${girl.address} ${girl.age}岁的女生 ${girl.name} 身高${girl.height}cm")
}
}
示例代码:
fun main(args: Array<String>) {
filterGirlsByAddressHeightAge("广东",165,25)
}
示例代码:
// 非诚勿扰
data class Girl(var name: String, var age: Int, var height: Int, var address: String)
// 非诚勿扰数据库
var feichengwuraoshujuku = listOf<Girl>(
Girl("依儿", 18, 168, "山东"),
Girl("笑笑", 19, 175, "河南"),
Girl("小百合", 18, 168, "山东"),
Girl("依儿", 17, 155, "福建"),
Girl("michel", 22, 148, "广东"),
Girl("猫咪", 28, 159, "广西"),
Girl("玲儿", 23, 169, "广东"),
Girl("环环", 25, 172, "安徽"),
Girl("胖嘟嘟", 32, 180, "河北"),
Girl("乔乔", 35, 180, "广东"),
Girl("小可爱", 27, 150, "江西"),
Girl("一生有你", 22, 163, "山东"),
Girl("敏儿", 28, 155, "黑龙江"),
Girl("月儿", 25, 178, "吉林"),
Girl("花儿", 21, 183, "山东"),
Girl("S小糖", 49, 190, "新疆"),
Girl("悦悦", 19, 160, "广西"),
Girl("小可爱", 29, 158, "广东"),
Girl("紫琪", 49, 149, "新疆"),
Girl("糖心", 26, 165, "甘肃"),
Girl("棒棒糖", 23, 172, "浙江"),
Girl("猪猪侠", 18, 173, "山东"),
Girl("喵喵", 27, 164, "河南"),
Girl("安琦", 19, 159, "河北"),
Girl("叶子", 20, 160, "广东")
)
// 根据地区过滤女生
fun filterGirlsByAddress(address: String) {
var mougediqu = ArrayList<Girl>()
for (girl in feichengwuraoshujuku) {
if (girl.address == address) {
mougediqu.add(girl)
}
}
for (girl in mougediqu) {
println("${girl.address} ${girl.age}岁的女生 ${girl.name}")
}
}
// 根据年龄过滤女生
fun filterGirlsByAge(age: Int) {
var mougenianling = ArrayList<Girl>()
for (girl in feichengwuraoshujuku) {
if (girl.age < age) {
mougenianling.add(girl)
}
}
for (girl in mougenianling) {
println("${girl.address} ${girl.age}岁的女生 ${girl.name}")
}
}
// 根据地区、身高、年龄过滤女生
fun filterGirlsByAddressHeightAge(address: String, height: Int, age: Int) {
var fuhetiaojian = ArrayList<Girl>()
for (girl in feichengwuraoshujuku) {
// 在kotlin 里 如果想要同时满足条件可以使用 And 关键字
if ((girl.age < age) and (girl.address == address) and (girl.height > height)) {
fuhetiaojian.add(girl)
}
}
for (girl in fuhetiaojian) {
println("${girl.address} ${girl.age}岁的女生 ${girl.name} 身高${girl.height}cm")
}
}
// flag:true 的话为喜欢年轻的 false 的话为喜欢年龄大的
fun filterGirlsByAddressHeightAgeFlag(address: String, height: Int, age: Int, flag: Boolean) {
var fuhetiaojian = ArrayList<Girl>()
if (flag) {
for (girl in feichengwuraoshujuku) {
// 在kotlin 里 如果想要同时满足条件可以使用 And 关键字
if ((girl.age < age) and (girl.address == address) and (girl.height > height)) {
fuhetiaojian.add(girl)
}
}
} else {
for (girl in feichengwuraoshujuku) {
// 在kotlin 里 如果想要同时满足条件可以使用 And 关键字
if ((girl.age > age) and (girl.address == address) and (girl.height > height)) {
fuhetiaojian.add(girl)
}
}
}
for (girl in fuhetiaojian) {
println("${girl.address} ${girl.age}岁的女生 ${girl.name} 身高${girl.height} cm")
}
}
示例代码:
fun main(args: Array<String>) {
filterGirlsByAddressHeightAgeFlag("广东",165,25,false)
}
上面的所有代码都会随着需求的提出而增加,这就是Java代码!
50_kotlin高阶函数实战(3)
行为参数化
把筛选的行为(函数)作为参数传递到过滤器里面
简洁代码,提高效率
高阶函数
一个用 函数作为参数或者返回值的 函数
高阶函数—maxBy
找年龄最大的妹子
// 找年龄最大的妹子
// it.age:拿某一个人的 age 进行 maxBy
// maxBy 这个方法的返回值就是一个集合,再把这个集合里面的内容打印出来
println("年龄最大的妹子:" + feichengwuraoshujuku1.maxBy { it.age })
// 拿到身高最高的妹子
println("身高最高的妹子:" + feichengwuraoshujuku1.maxBy { it.height })
高阶函数—minBy
找年龄最小的妹子
// 拿到身高最低的妹子
println("身高最低的妹子:" + feichengwuraoshujuku1.minBy { it.height })
高阶函数—filter
过滤特定条件的妹子
例如:找18岁以下的妹子
// 找18岁以上25岁以下、身高168以上的妹子
println("18岁以上、身高168以上的妹子:" + feichengwuraoshujuku1.filter {
(it.age > 18) and (it.height > 168) and (it.age < 25)
})
高阶函数—map
把妹子某个属性映射成新的集合
把所有妹子的名字列出来放入新的集合
// map :把妹子某个属性映射成新的集合
var result = feichengwuraoshujuku1.map {
"${it.name} : ${it.age}"
}
println("map集合" + result)
高阶函数—any
是否有满足某个条件的妹子
有没有年龄是28岁的山东妹子
// 高阶函数—any
// 用于判断是否有满足某个条件的妹子
// 判断是否有 18 岁的妹子
println(feichengwuraoshujuku1.any {
it.age == 18
})
高阶函数—count
统计满足条件妹子的个数
统计168以上妹子的个数
//高阶函数—count
//统计满足条件妹子的个数
// 年龄小于 25 岁的有多少个
println(feichengwuraoshujuku1.count {
it.age < 25
})
高阶函数—find
查找符合条件的妹子,并返回第一个
//高阶函数—find
//查找符合条件的妹子,并返回第一个
// 查找籍贯是 广东 的第一个妹子
println(feichengwuraoshujuku1.find {
it.address == "广东"
})
高阶函数—groupBy
按照特征把妹子分为不同的组
不同地区的妹子在不同的组
// 高阶函数—groupBy
// 按照特征把妹子分为不同的组
// 不同地区的妹子在不同的组
var result1 = feichengwuraoshujuku1.groupBy {
it.address
}
println("地区:" + result1)
// 高阶函数—groupBy
// 获取到广东的分组后打印出来
var result2 = feichengwuraoshujuku1.groupBy {
it.address
// 加上 ? 的原因是:万一广东组没有人呢
// 如果有人的话就迭代每一个,并打印出来
}.get("广东")?.forEach { println("广东 " + it) }
完整的代码:
创建一个File文件:Girl1
// 非诚勿扰
data class Girl1(var name: String, var age: Int, var height: Int, var address: String)
// 非诚勿扰数据库
var feichengwuraoshujuku1 = listOf<Girl1>(
Girl1("依儿", 18, 168, "山东"),
Girl1("笑笑", 19, 175, "河南"),
Girl1("小百合", 18, 168, "山东"),
Girl1("依儿", 17, 155, "福建"),
Girl1("michel", 22, 148, "广东"),
Girl1("猫咪", 28, 159, "广西"),
Girl1("玲儿", 23, 169, "广东"),
Girl1("环环", 25, 172, "安徽"),
Girl1("胖嘟嘟", 32, 180, "河北"),
Girl1("乔乔", 35, 180, "广东"),
Girl1("小可爱", 27, 150, "江西"),
Girl1("一生有你", 22, 163, "山东"),
Girl1("敏儿", 28, 155, "黑龙江"),
Girl1("月儿", 25, 178, "吉林"),
Girl1("花儿", 21, 183, "山东"),
Girl1("S小糖", 49, 190, "新疆"),
Girl1("悦悦", 19, 160, "广西"),
Girl1("小可爱", 29, 158, "广东"),
Girl1("紫琪", 49, 149, "新疆"),
Girl1("糖心", 26, 165, "甘肃"),
Girl1("棒棒糖", 23, 172, "浙江"),
Girl1("猪猪侠", 18, 173, "山东"),
Girl1("喵喵", 27, 164, "河南"),
Girl1("安琦", 19, 159, "河北"),
Girl1("叶子", 20, 160, "广东")
)
创建一个File文件:WuTai1
fun main(args: Array<String>) {
// 找年龄最大的妹子
// it.age:拿某一个人的 age 进行 maxBy
// maxBy 这个方法的返回值就是一个集合,再把这个集合里面的内容打印出来
println("年龄最大的妹子:" + feichengwuraoshujuku1.maxBy { it.age })
// 拿到身高最高的妹子
println("身高最高的妹子:" + feichengwuraoshujuku1.maxBy { it.height })
// 拿到身高最低的妹子
println("身高最低的妹子:" + feichengwuraoshujuku1.minBy { it.height })
// 找18岁以上25岁以下、身高168以上的妹子
println("18岁以上、身高168以上的妹子:" + feichengwuraoshujuku1.filter {
(it.age > 18) and (it.height > 168) and (it.age < 25)
})
// map :把妹子某个属性映射成新的集合
var result = feichengwuraoshujuku1.map {
"${it.name} : ${it.age}"
}
println("map集合" + result)
// 高阶函数—any
// 用于判断是否有满足某个条件的妹子
// 判断是否有 18 岁的妹子
println(feichengwuraoshujuku1.any {
it.age == 18
})
//高阶函数—count
//统计满足条件妹子的个数
// 年龄小于 25 岁的有多少个
println(feichengwuraoshujuku1.count {
it.age < 25
})
//高阶函数—find
//查找符合条件的妹子,并返回第一个
// 查找籍贯是 广东 的第一个妹子
println(feichengwuraoshujuku1.find {
it.address == "广东"
})
// 高阶函数—groupBy
// 按照特征把妹子分为不同的组
// 不同地区的妹子在不同的组
var result1 = feichengwuraoshujuku1.groupBy {
it.address
}
println("地区:" + result1)
// 高阶函数—groupBy
// 获取到广东的分组后打印出来
var result2 = feichengwuraoshujuku1.groupBy {
it.address
// 加上 ? 的原因是:万一广东组没有人呢
// 如果有人的话就迭代每一个,并打印出来
}.get("广东")?.forEach { println("广东 " + it) }
}
51_kotlin高阶函数实战-自定义dsl入门
DSL(领域特定语言)
扩展函数
示例代码:(Girl2)
// 非诚勿扰
data class Girl2(var name: String, var age: Int, var height: Int, var address: String)
// 非诚勿扰数据库
var feichengwuraoshujuku2 = listOf<Girl2>(
Girl2("依儿", 18, 168, "山东"),
Girl2("笑笑", 19, 175, "河南"),
Girl2("小百合", 18, 168, "山东"),
Girl2("依儿", 17, 155, "福建"),
Girl2("michel", 22, 148, "广东"),
Girl2("猫咪", 28, 159, "广西"),
Girl2("玲儿", 23, 169, "广东"),
Girl2("环环", 25, 172, "安徽"),
Girl2("胖嘟嘟", 32, 180, "河北"),
Girl2("乔乔", 35, 180, "广东"),
Girl2("小可爱", 27, 150, "江西"),
Girl2("一生有你", 22, 163, "山东"),
Girl2("敏儿", 28, 155, "黑龙江"),
Girl2("月儿", 25, 178, "吉林"),
Girl2("花儿", 21, 183, "山东"),
Girl2("S小糖", 49, 190, "新疆"),
Girl2("悦悦", 19, 160, "广西"),
Girl2("小可爱", 29, 158, "广东"),
Girl2("紫琪", 49, 149, "新疆"),
Girl2("糖心", 26, 165, "甘肃"),
Girl2("棒棒糖", 23, 172, "浙江"),
Girl2("猪猪侠", 18, 173, "山东"),
Girl2("喵喵", 27, 164, "河南"),
Girl2("安琦", 19, 159, "河北"),
Girl2("叶子", 20, 160, "广东")
)
// 扩展函数
// 在这个集合里查找一个年龄小于条件的妹子
fun List<Girl2>.chazhao(age: Int) {
filter {
it.age < age
}.forEach (::println)
}
示例代码:(WuTai2)
fun main(args: Array<String>) {
//
feichengwuraoshujuku2.chazhao(20)
}
中缀表达式
示例代码:(Girl3)
// 非诚勿扰
data class Girl3(var name: String, var age: Int, var height: Int, var address: String)
// 非诚勿扰数据库
var feichengwuraoshujuku3 = listOf<Girl3>(
Girl3("依儿", 18, 168, "山东"),
Girl3("笑笑", 19, 175, "河南"),
Girl3("小百合", 18, 168, "山东"),
Girl3("依儿", 17, 155, "福建"),
Girl3("michel", 22, 148, "广东"),
Girl3("猫咪", 28, 159, "广西"),
Girl3("玲儿", 23, 169, "广东"),
Girl3("环环", 25, 172, "安徽"),
Girl3("胖嘟嘟", 32, 180, "河北"),
Girl3("乔乔", 35, 180, "广东"),
Girl3("小可爱", 27, 150, "江西"),
Girl3("一生有你", 22, 163, "山东"),
Girl3("敏儿", 28, 155, "黑龙江"),
Girl3("月儿", 25, 178, "吉林"),
Girl3("花儿", 21, 183, "山东"),
Girl3("S小糖", 49, 190, "新疆"),
Girl3("悦悦", 19, 160, "广西"),
Girl3("小可爱", 29, 158, "广东"),
Girl3("紫琪", 49, 149, "新疆"),
Girl3("糖心", 26, 165, "甘肃"),
Girl3("棒棒糖", 23, 172, "浙江"),
Girl3("猪猪侠", 18, 173, "山东"),
Girl3("喵喵", 27, 164, "河南"),
Girl3("安琦", 19, 159, "河北"),
Girl3("叶子", 20, 160, "广东")
)
// 扩展函数
// 在这个集合里查找一个年龄小于条件的妹子
// infix:中缀表达式
infix fun List<Girl3>.chazhao(age: Int) {
filter {
it.age < age
}.forEach(::println)
}
infix fun List<Girl3>.chazhao1(age: Int) {
filter {
it.age > age
}.forEach(::println)
}
infix fun List<Girl3>.chazhao2(address: String) {
filter {
it.address == address
}.forEach(::println)
}
示例代码:(WuTai3)
fun main(args: Array<String>) {
// 在 Girl3 里在 chazhao() 方法里写了关键字 infix(中缀表达式)
// 有了中缀表达式之后,点(.)的调用可以变成空格的调用
// 领域特定编程
feichengwuraoshujuku3 chazhao 20
println("下面是查找大于30岁的!")
feichengwuraoshujuku3 chazhao1 30
println("下面是查找来自山东的!")
feichengwuraoshujuku3 chazhao2 "山东"
}