欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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