1.forEach函数
-示例1
/**
* 以下为自己定义的函数
* (String> -> Unit 函数类型 参数为字符串 返回值是Unit
*/
var print = fun (name:String):Unit{
println(name)
}
fun main(args:Array<String>) {
var names = listOf<String>("tom","jerry","lucy")
//1.forEach函数接收的是一个函数
//forEach函数的定义如下
/**
@kotlin.internal.HidesMembers
public inline fun <T> Iterable<T>.forEach(action: (T) -> Unit): Unit {
for (element in this) action(element)
}
*/
//2. action 的作用是将每一个值传到函数中
names.forEach(print) //print是一个函数
}
-示例2
可以在forEach后面直接写一个{} 括号中定义匿名函数,简化写法
fun main(args:Array<String>) {
var names = listOf<String>("tom","jerry","lucy")
//1.forEach函数接收的是一个函数
//2. 可以在forEach后面直接写一个{} 括号中定义匿名函数
names.forEach{
a -> println(a)
}
}
-示例3
forEach函数中默认有一个参数 it 可以直接使用
fun main(args:Array<String>) {
var names = listOf<String>("tom","jerry","lucy")
//1.forEach函数接收的是一个函数
//2. 可以在forEach后面直接写一个{} 括号中定义匿名函数
names.forEach{
println(it)
}
}
2.在kotlin中创建图片
import java.awt.image.BufferedImage
import java.io.File
import javax.imageio.ImageIO
fun main(args:Array<String>) {
//在内存中创建宽高为100的图片
var image = BufferedImage(100,100,BufferedImage.TYPE_INT_RGB)
var w = 0.. 99; //图片的宽
var h = 0.. 99; //图片的高
image.apply {
for(i in w){
for(j in h){
setRGB(i,j,0xff0000)
}
}
}
//图片保存到文件中
ImageIO.write(image,"bmp", File("a.bmp"))
}
3. maxBy函数
有以下数据
var 选手数据库 = listOf<Girl>(
Person("选手1",18,167,"山东"),
Person("选手2",19,167,"广东"),
Person("选手3",16,166,"湖南"),
Person("选手4",17,167,"浙江"),
Person("选手5",17,165,"四川"),
Person("选手6",19,167,"山西"),
Person("选手7",18,167,"陕西"),
Person("选手8",15,165,"西藏"),
Person("选手9",19,167,"河北"),
Person("选手10",18,169,"甘肃")
)
-在kotlin中筛选出年龄最大的选手,使用函数maxBy
//返回的是集合
println(选手数据库.maxBy { it.age });
4. filter函数
-使用多个条件过滤选手,使用filter函数
println(选手数据库.filter { (it.age>16) and (it.address=="山东") });
5. map函数
-从数据中按属性重新组成集合,使用map函数
//取出集合中 以age和address组成的新的集合并返回
println(选手数据库.map { "${it.age}: ${it.address}" });
//[18: 山东, 19: 广东, 16: 湖南, 17: 浙江, 17: 四川, 19: 山西, 18: 陕西]
6. any函数
-查看数据中是否有符合条件的数据,使用any函数
// any 返回Boolean 类型,查看数据中是否有符合条件的
println(选手数据库.any { it.age>16 });
7. count函数
-统计符合条件的数据量,使用count函数
// count 返回个数,统计符合条件的数据
println(选手数据库.count { it.age>16 });
8. find函数
-返回第 1 条符合条件的数据,使用find函数
// find 返回第一条符合条件的数据
println(选手数据库.find { it.age==16 });
9. groupBy 函数
-对数据进行分组并返回,使用groupBy 函数
println(选手数据库.groupBy { it.address });
//{山东=[Person(name=选手1, age=18, height=167, address=山东)], 广东=[Person(name=选手2, age=19, height=167, address=广东)]}
// 筛选某一组的人并打印 ?是有可能数据是空
选手数据库.groupBy { it.address }.get("山东")?.forEach { println(it) }
10. DSL
-扩展函数
有以下数据及扩展的方法
data class Person(var name:String,var age:Int, var height:Int, var address:String)
//模拟选手信息
var 选手数据库 = listOf<Person>(
Person("选手1",18,167,"山东"),
Person("选手2",19,167,"广东"),
Person("选手3",16,166,"湖南"),
Person("选手4",17,167,"浙江"),
Person("选手5",17,165,"四川"),
Person("选手6",19,167,"山西"),
Person("选手7",18,167,"陕西"),
Person("选手8",15,165,"西藏"),
Person("选手9",19,167,"河北"),
Person("选手10",18,169,"甘肃")
)
//扩展的方法
fun List<Person>.查找年龄小于17的(age: Int){
filter { it.age < age }.forEach(::println)
}
调用的时候
选手数据库.查找年龄小于17的(17)
//输出结果
Person(name=选手3, age=16, height=166, address=湖南)
Person(name=选手8, age=15, height=165, address=西藏)
-采用中缀表达式 (infix 关键字),进一步简化
//采用中缀表达式简化
infix fun List<Person>.查找年龄小于16的(age: Int){
filter { it.age < age }.forEach(::println)
}
调用的时候
//调用中缀表达式的函数,中间有空格分隔就可以调用
选手数据库 查找年龄小于16的 16
//输出结果
Person(name=选手8, age=15, height=165, address=西藏)
网友评论