Kotlin如何使用类似C#的yield功能详解
前言
用过c#的可能对yield关键字爱不释手,那么在像我这种被迫上java贼船的人,就想找到类似的功能。
关于c#中的yield关键字大家可以参考这篇文章:https://www.nhooo.com/article/63859.htm
我使用的是kotlin,下面的方法演示了产生一个序列的功能。
valfibonacciSeq=buildSequence{ vara=0 varb=1 yield(1) while(true){ yield(a+b) valtmp=a+b a=b b=tmp } } funmain(args:Array){ fibonacciSeq.take(50).forEach{ println(it) } }
程序将执行50次然后退出。
实现枚举器
上面的代码使用的是序列功能,并非是常见的枚举器,下面的代码更像c#的枚举器。
classMyList:Iterable{ privatevallist=arrayOf(1,2,3,4,5,6) overridefuniterator():Iterator { returnbuildIterator{ valsize=list.size for(iin0untilsize){ yield(list[i]+i) } } } } funmain(args:Array ){ vallist=MyList() for(pinlist){ println(p) } }
实现类似Linq
我们在使用Linq时可以将序列不断的变换,Kotlin也可以很方便的处理。
//将输入的数据+1 funDo1(seq:Sequence):Sequence { returnbuildSequence{ for(iinseq){ yield(i+1) } } } //变换成字符串 funDo2(seq:Sequence ):Sequence { returnbuildSequence{ for(iinseq){ yield("hello$i") } } } //将多个数据聚合到一个数据 funDo3(seq:Sequence ):Sequence { returnbuildSequence{ varresult="" varcount=0 for(iinseq){ result+=i count++ if(count==3){ yield(result) result="" count=0 } } if(count>0){ yield(result) } } } funmain(args:Array ){ valdata=arrayOf(1,2,3,4,5,6,7,8) valresult=Do3(Do2(Do1(data.asSequence()))) for(pinresult){ println(p) } }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。