学校的白色咖啡屋(二):效率的胜利 Collections And Sequences

「既然已经知道了interface,就可以来看Collections三大interface——ListSetMap。和阵列Array一样,是放入多笔资料的资料结构,一开始就要选好是成员固定还是成员可变动的状态。」
唯心在纸上将初始化的函式按照状态归类。
成员固定:listOf()mapOf()setOf()
成员可变动:mutableListOf()mutableMapOf()mutableSetOf()

「每种资料结构都有其特性:Array不能改变长度,因为被宣告长度之後,会专门分配一块连续的记忆体List重视成员之间的顺序,所以可以用index取得该位置的成员;Set会马上合并重复的成员,因此成员都是独一无二,但也因此不在乎成员之间的顺序;Map因为成员存放的位置比较复杂,会让我们指定每个位置的key来映射,所以可以用key取得该位置的成员。」

Collections被学姐拿出来特别介绍,应该有特殊的地方罗?」得到猫咪的治癒後,诗忆以超出平常的敏锐发问。

「是的,Collections提供各种好用的函式,之前需要写回圈才能做到的筛选,现在只需要呼叫filter。虽然也可以再用一次之前饮料价钱的例子,不过老用同样的筛选条件缺乏新鲜感呢⋯⋯」唯心沈吟了片刻才作出决定。「这次用品项名来筛选吧。利用判断结尾字串的函式endsWith来检验品项名,只保留奶茶系列的饮料。」

fun main() {
    val drinks = listOf(Drink("奶茶", 50), Drink("绿奶茶", 30), Drink("可可", 40), 
                       Drink("珍珠奶茶", 70))
    val milkTeas = drinks.filter { it.name.endsWith("奶茶") }
    println(milkTeas)
}

电脑在她的操作下印出[Drink(name=奶茶, price=50), Drink(name=绿奶茶, price=30), Drink(name=珍珠奶茶, price=70)]的结果。

「现在我们再加上一个只要列出品项名的情境,比如请客提供的单子是不会附上价格的。这时可以用map函式,虽然和Map名字一样,其实相同的只有映射动作,会把类别成员的品项名属性拉出来,产生新的字串list,然後再根据新list去筛选。」

fun main() {
    val drinks = listOf(Drink("奶茶", 50), Drink("绿奶茶", 30), Drink("可可", 40), 
                       Drink("珍珠奶茶", 70))
    val milkTeaNames = drinks.map(Drink::name).filter { it.endsWith("奶茶") }
    println(milkTeaNames)
}

这次电脑果然只印出品项名[奶茶, 绿奶茶, 珍珠奶茶]

「如果只想请前两种奶茶,可以用take函式,只是这样写的话,程序还是筛选出全部的奶茶才输出前两种。现在是因为我一开始列出的饮料只有四笔,所以时间没什麽影响。但如果饮料资料有上万笔的话,会希望加快回报的效率,找到两笔奶茶饮料就不继续筛选後面的饮料。这时候就要利用asSequence()转成Sequences类别,Sequences类别的特性是一笔资料跑到终点才跑下一笔,而take(2)的条件正在终点线内。这个特性还满实用的,好好记住唷。」唯心递出她的黄色萤光笔,诗忆接过後马上在asSequence()划上深刻的重点线。

fun main() {
    val drinks = listOf(Drink("奶茶", 50), Drink("绿奶茶", 30), Drink("可可", 40), 
                       Drink("珍珠奶茶", 70))
    val milkTeaNames2 = drinks.map(Drink::name).filter { it.endsWith("奶茶") } }.take(2)
    val milkTeasNames2Seq = drinks.asSequence().map(Drink::name).filter { it.endsWith("奶茶") }.take(2) }
	println(milkTeaNames2)
	println(milkTeaNames2Seq.toList())
}

<<:  [Day 23] 资料产品在设计与开发阶段的五个大坑

>>:  [Day8] 机器学习进行时间序列预测及注意事项(上)

Vaadin Pro Components 图表初探 - day26

目标 使用 Pro Components 制作图表 萤幕截图 汇出png图 Vaadin Chart...

day5 - API接口设计: gRPC & http API 简介

当你把产品包装好之後, 要怎麽销售出去呢? 『销售』套用在系统开发上面就是怎麽让外部的系统能够使用到...

Day9:[资料结构] Linked-List - 链结串列

Linked List为抽象的资料结构,概念有点像三国的连环船,一艘船(节点)连结着下一艘船(节点...

day 29 - timestamp & 定时执行

我们系统的沟通都是透过timestamp, 包含API参数跟资料库的储存都是以timestamp为主...

DAY 20 我要+1 群组团购辅助机器人(补)

上篇只做出了大部分功能,有很多细节没做好,这篇会修正细节与优化 PostgreSQL IF stat...