Kotlin特性笔记
程序员文章站
2022-03-09 08:05:24
Kotlin特性笔记一、Streamjava 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。我们对比kotlin的高阶拓展函数实现:实体类data class Apple(...
Kotlin特性笔记
一、Stream
-
java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。
-
这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
-
元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。
我们对比kotlin的高阶拓展函数实现:
实体类
data class Apple(var id: Int?, var name: String?, var money: BigDecimal?, var num: Int?) {
constructor() : this(null, null, null, null)
fun getMe() = this
fun getMoney() = money!!.toDouble()
}
存进List
val appleList = ArrayList<Apple>() //存放apple对象集合
val apple1 = Apple(1, "苹果1", BigDecimal("3.25"), 10)
val apple12 = Apple(1, "苹果2", BigDecimal("1.35"), 20)
val apple2 = Apple(2, "香蕉", BigDecimal("2.89"), 30)
val apple3 = Apple(3, "荔枝", BigDecimal("9.99"), 40)
appleList.add(apple1)
appleList.add(apple12)
appleList.add(apple2)
appleList.add(apple3)
分组
List里面的对象元素,以某个属性来分组,例如,以id分组,将id相同的放在一起:
appleList.also { println("Java Stream:") }.stream().collect(Collectors.groupingBy(Apple::id)).forEach { (t, u) ->
println("\t\t$t -> $u")
}
appleList.also { println("Kotlin Stream:") }.groupBy(Apple::id, Apple::getMe).forEach { (t, u) ->
println("\t\t$t -> $u")
}
List转Map
List转Map id为key,apple对象为value,可以这么做:
//Java
appleList.also { println("Java Stream:") }.stream().collect(Collectors.toMap(Apple::id, fun(a: Apple) = a) { it1, it2 ->
if (it1.name == "苹果2") it1 else it2
}).forEach { (t, u) ->
println("\t\t$t -> $u")
}
//Kotlin
appleList.also { println("Kotlin Stream:") }.associateBy { it.id }.forEach { (t, u) ->
println("\t\t$t -> $u")
}
过滤Filter
从集合中过滤出来符合条件的元素:
//java
appleList.also { println("Java Stream:") }.stream().filter { it.name != "香蕉" }.collect(Collectors.toList()).forEach { println("\t\t$it") }
//kotlin
appleList.also { println("Kotlin Stream:") }.filter { it.name != "香蕉" }.forEach { println("\t\t$it") }
求和
将集合中的数据按照某个属性求和:
//java
println("\t\t总金额为:${appleList.also { println("Java Stream:") }.stream().collect(Collectors.summingDouble(Apple::getMoney))}元")
//kotlin
println("\t\t总金额为:${appleList.also { println("Kotlin Stream:") }.sumByDouble { it.getMoney() }}元")
最大值&最小值
求集合中的数据某个属性的最大值&最小值:
//java
println("最大值:" + appleList.stream().max { o1, o2 -> if (o1.num!! > o2.num!!) 1 else -1 }.get())
println("最小值:" + appleList.stream().min { o1, o2 -> if (o1.num!! > o2.num!!) 1 else -1 }.get())
//kotlin
println("最大值:" + appleList.maxWith(kotlin.Comparator { o1, o2 -> if (o1.num!! > o2.num!!) 1 else -1 }))
println("最小值:" + appleList.minWith(kotlin.Comparator { o1, o2 -> if (o1.num!! > o2.num!!) 1 else -1 }))
去重
去除对于相同id的对象:
appleList.also { println("去重") }.distinctBy { it.id }.forEach { println("\t\t$it") }
完整代码
data class Apple(var id: Int?, var name: String?, var money: BigDecimal?, var num: Int?) {
constructor() : this(null, null, null, null)
fun getMe() = this
fun getMoney() = money!!.toDouble()
}
fun main(args: Array<String>) {
val appleList = ArrayList<Apple>() //存放apple对象集合
val apple1 = Apple(1, "苹果1", BigDecimal("3.25"), 10)
val apple12 = Apple(1, "苹果2", BigDecimal("1.35"), 20)
val apple2 = Apple(2, "香蕉", BigDecimal("2.89"), 30)
val apple3 = Apple(3, "荔枝", BigDecimal("9.99"), 40)
appleList.add(apple1)
appleList.add(apple12)
appleList.add(apple2)
appleList.add(apple3)
//1、分组 List里面的对象元素,以某个属性来分组,例如,以id分组,将id相同的放在一起:
appleList.also { println("Java Stream:") }.stream().collect(Collectors.groupingBy(Apple::id)).forEach { (t, u) ->
println("\t\t$t -> $u")
}
appleList.also { println("Kotlin Stream:") }.groupBy(Apple::id, Apple::getMe).forEach { (t, u) ->
println("\t\t$t -> $u")
}
println()
// 2、List转Map id为key,apple对象为value,可以这么做:
appleList.also { println("Java Stream:") }.stream().collect(Collectors.toMap(Apple::id, fun(a: Apple) = a) { it1, it2 ->
if (it1.name == "苹果2") it1 else it2
}).forEach { (t, u) ->
println("\t\t$t -> $u")
}
appleList.also { println("Kotlin Stream:") }.associateBy { it.id }.forEach { (t, u) ->
println("\t\t$t -> $u")
}
println()
//3、过滤Filter 从集合中过滤出来符合条件的元素:
appleList.also { println("Java Stream:") }.stream().filter { it.name != "香蕉" }.collect(Collectors.toList()).forEach { println("\t\t$it") }
appleList.also { println("Kotlin Stream:") }.filter { it.name != "香蕉" }.forEach { println("\t\t$it") }
println()
//4.将集合中的数据按照某个属性求和:
println("\t\t总金额为:${appleList.also { println("Java Stream:") }.stream().collect(Collectors.summingDouble(Apple::getMoney))}元")
println("\t\t总金额为:${appleList.also { println("Kotlin Stream:") }.sumByDouble { it.getMoney() }}元")
println()
//5.求集合中的数据某个属性的最大值&最小值
println("最大值:" + appleList.stream().max { o1, o2 -> if (o1.num!! > o2.num!!) 1 else -1 }.get())
println("最小值:" + appleList.stream().min { o1, o2 -> if (o1.num!! > o2.num!!) 1 else -1 }.get())
println("最大值:" + appleList.maxWith(kotlin.Comparator { o1, o2 -> if (o1.num!! > o2.num!!) 1 else -1 }))
println("最小值:" + appleList.minWith(kotlin.Comparator { o1, o2 -> if (o1.num!! > o2.num!!) 1 else -1 }))
println()
//6.去重:去除对于相同id的对象
appleList.also { println("去重") }.distinctBy { it.id }.forEach { println("\t\t$it") }
}
输出
Java Stream:
1 -> [Apple(id=1, name=苹果1, money=3.25, num=10), Apple(id=1, name=苹果2, money=1.35, num=20)]
2 -> [Apple(id=2, name=香蕉, money=2.89, num=30)]
3 -> [Apple(id=3, name=荔枝, money=9.99, num=40)]
Kotlin Stream:
1 -> [Apple(id=1, name=苹果1, money=3.25, num=10), Apple(id=1, name=苹果2, money=1.35, num=20)]
2 -> [Apple(id=2, name=香蕉, money=2.89, num=30)]
3 -> [Apple(id=3, name=荔枝, money=9.99, num=40)]
Java Stream:
1 -> Apple(id=1, name=苹果2, money=1.35, num=20)
2 -> Apple(id=2, name=香蕉, money=2.89, num=30)
3 -> Apple(id=3, name=荔枝, money=9.99, num=40)
Kotlin Stream:
1 -> Apple(id=1, name=苹果2, money=1.35, num=20)
2 -> Apple(id=2, name=香蕉, money=2.89, num=30)
3 -> Apple(id=3, name=荔枝, money=9.99, num=40)
Java Stream:
Apple(id=1, name=苹果1, money=3.25, num=10)
Apple(id=1, name=苹果2, money=1.35, num=20)
Apple(id=3, name=荔枝, money=9.99, num=40)
Kotlin Stream:
Apple(id=1, name=苹果1, money=3.25, num=10)
Apple(id=1, name=苹果2, money=1.35, num=20)
Apple(id=3, name=荔枝, money=9.99, num=40)
Java Stream:
总金额为:17.48元
Kotlin Stream:
总金额为:17.48元
最大值:Apple(id=3, name=荔枝, money=9.99, num=40)
最小值:Apple(id=1, name=苹果1, money=3.25, num=10)
最大值:Apple(id=3, name=荔枝, money=9.99, num=40)
最小值:Apple(id=1, name=苹果1, money=3.25, num=10)
去重
Apple(id=1, name=苹果1, money=3.25, num=10)
Apple(id=2, name=香蕉, money=2.89, num=30)
Apple(id=3, name=荔枝, money=9.99, num=40)
数据来自:https://zhuanlan.zhihu.com/p/197291348
本文地址:https://blog.csdn.net/qq_40803115/article/details/109645409
上一篇: signal 信号处理例子
下一篇: Java语言基础详细版笔记理论