小型购物网站开发费用,最新域名永久跳转,金华哪里有做网站的公司4000-262-,网站建设需要经历什么步骤1 通过序列提高效率
首先看以下代码#xff1a;
val list listOf(1, 2, 3, 4, 5)
list.filter { it 2 }.map { it * 2 }上面的写法很简单#xff0c;在处理集合时#xff0c;类似于上面的操作能帮我们解决大部分的问题。但是#xff0c;当 list 中的元素非常多的时…1 通过序列提高效率
首先看以下代码
val list listOf(1, 2, 3, 4, 5)
list.filter { it 2 }.map { it * 2 }上面的写法很简单在处理集合时类似于上面的操作能帮我们解决大部分的问题。但是当 list 中的元素非常多的时候比如超过 10 万上面的操作在处理集合的时候就会显得比较低效。
filter 方法和 map 方法都会返回都会返回一个新的集合也就是说上面的操作会产生两个临时集合因为 list 会先调用 filter 方法然后产生的集合会再次调用 map 方法。如果 list 中的元素非常多这将是一笔不小的开销。为了解决这个问题Sequence序列就出现了。序列可以避免创建这些临时的中间对象。
以下是序列的使用
val list listOf(1, 2, 3, 4, 5)
list.asSequence().filter { it 2 }.map { it * 2 }.toList()首先通过 asSequence() 方法将列表转换为一个序列然后在这个序列上进行相应的操作最后通过 toList() 方法将序列转换为列表。
将 list 转换为序列在很大程度上就提高了上面操作集合的效率。这是因此在使用序列的时候filter 方法和 map 方法的操作都没有创建额外的集合这样当集合中的元素数量巨大的时候就减少了大部分开销。
在 Kotlin 中序列中元素的求值是惰性的这就意味着在利用序列进行链式求值时不需要像操作普通集合那样每进行一次求值操作就产生一个新的集合保存中间数据。那么惰性又是什么意思呢
在编程语言理论中惰性求值Lazy Evaluation表示一种在需要时才进行求值的计算方式。在使用惰性求值的时候表达式不在它被绑定到变量之后就立即求值而是在该值被取用时才去求值。通过这种方式不仅能得到性能上的提升还有一个重要的好处就是它可以构造出一个无限的数据类型。
通过上面的定义我们可以知道惰性求值的两个好处一个是优化性能另一个就是能构造出无限的数据类型。
2 序列的操作方式
我们知道序列中元素的求值方式是采用惰性求值的。那么惰性求值在序列中是如何体现的呢
以下面的代码为例
list.asSequence().filter { it 2 }.map { it * 2 }.toList()在这个例子中我们对序列总共执行了两类操作第一类
filter { it 2 }.map { it * 2 }filter 和 map 的操作返回的都是序列我们将这类操作称为中间操作。还有一类
toList()这一类操作序列转换为 List我们将这类操作称为末端操作。其实Kotlin 中序列的操作就分为两类一类是中间操作另一类则是末端操作。
2.1 中间操作
在对普通集合进行链式操作的时候有些操作会产生中间集合当用这类操作来对序列进行求值的时候它们就被称为中间操作比如上面的 filter 和 map。
每一次中间操作返回的都是一个序列产生的新序列内部知道如何去变换原来序列中的元素。中间操作都是采用惰性求值的 比如
list.asSequence().filter {println(filter $it)it 2
}.map {println(map $it)it * 2
}执行没有打印说明上面的操作中的 println 方法根本就没有执行这说明 filter 方法和 map 方法的执行被延迟了这就是惰性求值的体现。
惰性求值仅仅在该值被需要的时候才会真正去求值。那么这个“被需要”的状态该怎么触发呢这就是另外一个操作了——末端操作。
2.2 末端操作
在对集合进行操作的时候大部分情况下我们在意的只是结果而不是中间过程。
末端操作就是一个返回结果的操作它的返回值不能是序列必须是一个明确的结果比如列表、数字、对象等表意明确的结果。末端操作一般都是放在链式操作的末尾在执行末端操作的时候会出发中间操作的延迟计算也就是将被需要这个状态打开了。
下面给上面的例子加上末端操作
list.asSequence().filter {println(filter $it)it 2
}.map {println(map $it)it * 2
}.toList()//filter 1
//filter 2
//filter 3
//map 3
//filter 4
//map 4
//filter 5
//map 5可以看到所有的中间操作都被执行了。
如果不用序列而是用列表来实现会有什么不同之处
list.filter {println(filter $it)it 2
}.map {println(map $it)it * 2
}.toList()//filter 1
//filter 2
//filter 3
//filter 4
//filter 5
//map 3
//map 4
//map 5通过对比上面的结果可以发现普通集合在进行链式操作的时候会现在 list 上调用 filter然后产生一个结果列表接下来 map 就在这个结果列表上进行操作。而序列不一样序列在执行链式操作时会将所有的操作都引用在一个元素上也就是说第 1 个元素执行完所有的操作之后第 2 个元素在去执行所有的操作以此类推。
反映扫上面的这个例子就是第 1 个元素执行了 filter 之后再去执行 map然后第 2 个元素也是这样。通过上面序列的返回结果可以知道由于列表中的元素 1、2 没有满足 filter 操作中大于 2 的条件所以接下来的 map 操作就不会去执行了。所以当我们使用序列的时候如果 filter 和 map 的位置是可以相互调换的话应该优先使用 filter这样会减少一部分开销。
3 序列可以是无限的
惰性求值最大的好处就是可以构造出一个无限的数据类型。
那么我们是否可以使用序列来构造一个无限的数据类型呢答案是肯定的。常见的无限数据类型是什么呢数列比如自然数数列就是一个无限的数列。
那么如何去实现一个自然数列呢采用一般的列表肯定是不行的因为构建一个列表必须列举出列表中元素而我们是么有办法将自然数全部列举出来。
自然数是有一定规律的就是后一个数永远是前一个数加 1 的结果我们只需要实现一个列表让这个列表描述这种规律那么也就是相当于实现了一个无限的自然数数列。Kotlin 为我们提供了这样一个方法去创建无限的数列
val naturalNumList generateSequence(0) { it 1 }通过上面着一行代码通过调用 generateSequence 就非常简单地实现了自然数数列。
我们知道序列是惰性求值的所以上面创建的序列是不会把所有的自然数都列举出来的只有在我们调用一个末端操作的时候才去列举我们所需要的列表。
比如我们要从这个自然数列表中取出前 10 个自然数
val list naturalNumList.takeWhile { it 9 }.toList()
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]关于无限序列这一点我们不能将一个无限的数据结构通过穷举的方式呈现出来而只是实现了一种表示无限的状态让我们在使用的时候感觉它是无限的。
4 序列与 Java 8 Stream 对比
序列看上去就和 Java 8 中的流Stream比较类似。下面就列举一些 Java 8 Stream 中比较常见的特性并与 Kotlin 中的序列进行比较。
4.1 Java 也能使用函数风格 API
在 Java 8 出来之后在 Java 中也能像在 Kotlin 中那样操作集合了
students.stream().filter(it - it.sex m).collect(toList());在上面的 Java 代码中我们通过使用 stream 就能够使用类似于 filter 这种简洁的函数式 API 了。
但是相比于 KotlinJava 的这种操作方式还是有些繁琐因为如果要对集合使用这种 API就必须先将集合转换为 stream操作完成之后还要将 stream 转换为 List这种操作有点类似于 Kotlin 的序列。这是因为 Java 8 的流和 Kotlin 中的序列一样也是惰性求值的这就意味着 Java 8 的流也是存在中间操作和末端操作的所以必须通过上面的一系列转换才行。
4.2 Stream 是一次性的
与 Kotlin 的序列不同Java 8 中的流是一次性的。意思就是说如果我们创建了一个 Stream我们只能在这个 Stream 上遍历一次。这就和迭代器很相似当我们遍历万之后这个流就相当于被消费掉了我们必须再创建一个新的 Stream 才能再遍历一次。
StreamStudent studentsStream students.stream();
studentsStream.filter(it - it.sex m).collect(toList());
studentsStream.filter(it - it.sex f).collect(toList());4.3 Stream 能够并行处理数据
Java 8 中的流非常强大其中有一个非常重要的特性就是 Java 8 Stream 能够在多核架构上并行的进行流处理。比如将前面的例子转换为并行处理的方式如下
students.paralleStream().filter(it - it.sex m).collect(toList());
文章转载自: http://www.morning.cyfsl.cn.gov.cn.cyfsl.cn http://www.morning.zymgs.cn.gov.cn.zymgs.cn http://www.morning.kfmlf.cn.gov.cn.kfmlf.cn http://www.morning.mrgby.cn.gov.cn.mrgby.cn http://www.morning.lxmmx.cn.gov.cn.lxmmx.cn http://www.morning.youprogrammer.cn.gov.cn.youprogrammer.cn http://www.morning.rshkh.cn.gov.cn.rshkh.cn http://www.morning.ghgck.cn.gov.cn.ghgck.cn http://www.morning.tlnbg.cn.gov.cn.tlnbg.cn http://www.morning.krklj.cn.gov.cn.krklj.cn http://www.morning.bwttj.cn.gov.cn.bwttj.cn http://www.morning.zfkxj.cn.gov.cn.zfkxj.cn http://www.morning.lpcpb.cn.gov.cn.lpcpb.cn http://www.morning.wrtsm.cn.gov.cn.wrtsm.cn http://www.morning.wqtzs.cn.gov.cn.wqtzs.cn http://www.morning.kxqwg.cn.gov.cn.kxqwg.cn http://www.morning.qxlgt.cn.gov.cn.qxlgt.cn http://www.morning.yrjfb.cn.gov.cn.yrjfb.cn http://www.morning.msxhb.cn.gov.cn.msxhb.cn http://www.morning.wsjnr.cn.gov.cn.wsjnr.cn http://www.morning.wqmyh.cn.gov.cn.wqmyh.cn http://www.morning.gcdzp.cn.gov.cn.gcdzp.cn http://www.morning.lzph.cn.gov.cn.lzph.cn http://www.morning.gwyml.cn.gov.cn.gwyml.cn http://www.morning.stbhn.cn.gov.cn.stbhn.cn http://www.morning.ptzbg.cn.gov.cn.ptzbg.cn http://www.morning.wgkz.cn.gov.cn.wgkz.cn http://www.morning.bfnbn.cn.gov.cn.bfnbn.cn http://www.morning.prgrh.cn.gov.cn.prgrh.cn http://www.morning.kmkpm.cn.gov.cn.kmkpm.cn http://www.morning.mmtjk.cn.gov.cn.mmtjk.cn http://www.morning.kjcll.cn.gov.cn.kjcll.cn http://www.morning.pcxgj.cn.gov.cn.pcxgj.cn http://www.morning.fbjnr.cn.gov.cn.fbjnr.cn http://www.morning.nknt.cn.gov.cn.nknt.cn http://www.morning.kqwsy.cn.gov.cn.kqwsy.cn http://www.morning.rmppf.cn.gov.cn.rmppf.cn http://www.morning.wnnts.cn.gov.cn.wnnts.cn http://www.morning.hkchp.cn.gov.cn.hkchp.cn http://www.morning.xsymm.cn.gov.cn.xsymm.cn http://www.morning.xgbq.cn.gov.cn.xgbq.cn http://www.morning.lsssx.cn.gov.cn.lsssx.cn http://www.morning.znlhc.cn.gov.cn.znlhc.cn http://www.morning.knzmb.cn.gov.cn.knzmb.cn http://www.morning.ffdyy.cn.gov.cn.ffdyy.cn http://www.morning.gwtbn.cn.gov.cn.gwtbn.cn http://www.morning.mwlxk.cn.gov.cn.mwlxk.cn http://www.morning.fprll.cn.gov.cn.fprll.cn http://www.morning.cwrpd.cn.gov.cn.cwrpd.cn http://www.morning.nwljj.cn.gov.cn.nwljj.cn http://www.morning.glswq.cn.gov.cn.glswq.cn http://www.morning.zrks.cn.gov.cn.zrks.cn http://www.morning.gnkdp.cn.gov.cn.gnkdp.cn http://www.morning.rlhgx.cn.gov.cn.rlhgx.cn http://www.morning.trhlb.cn.gov.cn.trhlb.cn http://www.morning.xmhpq.cn.gov.cn.xmhpq.cn http://www.morning.fjzlh.cn.gov.cn.fjzlh.cn http://www.morning.bbjw.cn.gov.cn.bbjw.cn http://www.morning.hbkkc.cn.gov.cn.hbkkc.cn http://www.morning.kaoshou.net.gov.cn.kaoshou.net http://www.morning.diuchai.com.gov.cn.diuchai.com http://www.morning.rbktw.cn.gov.cn.rbktw.cn http://www.morning.cmqrg.cn.gov.cn.cmqrg.cn http://www.morning.gjwkl.cn.gov.cn.gjwkl.cn http://www.morning.dskzr.cn.gov.cn.dskzr.cn http://www.morning.trzzm.cn.gov.cn.trzzm.cn http://www.morning.weiwt.com.gov.cn.weiwt.com http://www.morning.huayaosteel.cn.gov.cn.huayaosteel.cn http://www.morning.mnmrx.cn.gov.cn.mnmrx.cn http://www.morning.fdmfn.cn.gov.cn.fdmfn.cn http://www.morning.xrwsg.cn.gov.cn.xrwsg.cn http://www.morning.sgrwd.cn.gov.cn.sgrwd.cn http://www.morning.ftnhr.cn.gov.cn.ftnhr.cn http://www.morning.sqqhd.cn.gov.cn.sqqhd.cn http://www.morning.rzmkl.cn.gov.cn.rzmkl.cn http://www.morning.gyqnc.cn.gov.cn.gyqnc.cn http://www.morning.thwcg.cn.gov.cn.thwcg.cn http://www.morning.yydzk.cn.gov.cn.yydzk.cn http://www.morning.dwkfx.cn.gov.cn.dwkfx.cn http://www.morning.tbzcl.cn.gov.cn.tbzcl.cn