Streams trong Scala

Stream là gì?

Một stream giống như một list, ngoại trừ việc các phần tử của nó có tính lazy. Do vậy mà stream có thể dài vô tận. Chỉ những phần tử nào được yêu cầu thì mới được tính toán.

Tạo một stream như thế nào?

Tạo một stream tương tự việc tạo list, đối với list, ta sử dụng toán tử ::, còn với stream sẽ dùng #::
Bài toán: Tạo một stream với 3 phần tử 1, 2, 3
Bạn có thể tham khảo các cách sau:

scala> val c1 = 1#::2#::3#::4#::Stream.empty
c1: scala.collection.immutable.Stream[Int] = Stream(1, ?)

scala> val c2 = 1#::2#::Stream.apply(3)
c2: scala.collection.immutable.Stream[Int] = Stream(1, ?)

scala> val c3 = Stream(1,2,3)
c3: scala.collection.immutable.Stream[Int] = Stream(1, ?)

scala> val c4 = (1 to 3) toStream
warning: there was one feature warning; re-run with -feature for details
c4: scala.collection.immutable.Stream[Int] = Stream(1, ?)

Ở trường hợp thứ 4, có warning, bạn có thể sửa lại:

val c4 = (1 to 3).toList.toStream
c4: scala.collection.immutable.Stream[Int] = Stream(1, ?)

Head của stream là 1, tail là 1, 2 và 3. Tuy nhiên thì tail của stream không được in ra, bởi vì nó chưa được yêu cầu để tính toán.

Vừa rồi chúng ta đã tạo một stream hữu hạn phần tử, bây giờ ta sẽ tạo stream vô hạn phần tử qua ví dụ sau:
Ví dụ: Tạo stream dãy fibonacci

def fibo(a: Int, b: Int): Stream[Int] = a#::fibo(b, a+b)
fibo: (a: Int, b: Int)Stream[Int]
val s = fibo(1,1)
s: Stream[Int] = Stream(1, ?)

Stream dãy fibonacci đã được tạo, giả sử bây giờ chúng ta lấy 10 phần tử đầu tiên của dãy:

s.take(10).toList 
res0: List[Int] = List(1, 1, 2, 3, 5, 8, 13, 21, 34, 55)

Bạn hãy thử sức với bài toán sau và để lại kết quả nhé:
“In ra dãy n số nguyên tố đầu tiên với n nguyên dương bất kỳ được nhập từ bàn phím”

Tài liệu tham khảo:
http://www.scala-lang.org/docu/files/collections-api/collections_14.html

Add a Comment

Scroll Up