Merging streams in scala
 
我需要帮助将两个流合并为一个。输出必须如下:
| 1
 | (elem1list1#elem1list2, elem2list1#elem2list2...) | 
,如果任何流为空,该函数就会中断
| 12
 3
 4
 5
 
 | def mergeStream( a:  Stream[ A] , b:  Stream[ A]): Stream[ A] = 
if ( a.isEmpty  || b.isEmpty)  Nil
else ( a,b) match {
case( x#:: xs, y#:: ys) =>  x#:: y
} | 
有什么提示如何解决?
您可以使用scalaz中的交错:
| 12
 
 | scala> (Stream(1,2) interleave Stream.from(10)).take(10).forceres1: scala.collection.immutable.Stream[Int] = Stream(1, 10, 2, 11, 12, 13, 14, 15, 16, 17)
 | 
您也可以将两个Stream一起zip一起使用,这将截断较长的Stream,并将它们从元组中删除flatMap:
| 1
 | a.zip( b) .flatMap { case ( a, b) =>  Stream( a, b) } | 
尽管我不能说它的效率。
| 12
 3
 4
 5
 6
 7
 8
 
 | scala> val  a =  Stream(1 ,2 ,3 ,4) 
a:  scala.collection .immutable .Stream[ Int] =  Stream(1 , ?) 
scala> val  b =  Stream.from(3) 
b:  scala.collection .immutable .Stream[ Int] =  Stream(3 , ?) 
scala> val  c =  a.zip( b) .flatMap { case ( a, b) =>  Stream( a, b) } .take(10) .toList 
c:  List[ Int] =  List(1 , 3 , 2 , 4 , 3 , 5 , 4 , 6) | 
| 12
 3
 4
 5
 6
 7
 
 | def mergeStream( s1:  Stream[ Int] , s2:  Stream[ Int]):  Stream[ Int] = ( s1, s2) match {
  case ( x#:: xs, y#:: ys) =>  x #::  y #::  mergeStream( xs, ys)
  case _ =>  Stream.empty
} 
scala>  mergeStream( Stream.from(1) , Stream.from(100)) .take(10) .toList 
res0:  List[ Int] =  List(1 , 100 , 2 , 101 , 3 , 102 , 4 , 103 , 5 , 104) |