Sự tiện dụng của hàm continually trong scala
Scala
50
White

huydx viết ngày 16/08/2015

Trong scala thì khi phải thao tác với IO bạn có khá nhiều sự lựa chọn:

  • Thư viện IO bundle với scala: Scala.IO._
  • Dùng hàng của java (các loại input stream như là ByteArrayInputStream, BufferedInputStream...) (có dịp mình sẽ viết thêm về sự khác nhau của các loại này ra sao)
  • Dùng hàng tuyển có sẵn : thư viện common IO của apache

Khi sử dụng thì thằng đi kèm lại là thẳng lởm nhất (Scala.IO). Lý do tại sao nó lởm thì: vừa không support xử lý với byte, interface thì giới hạn (cho đọc từ URL nhưng lại giới hạn scheme là file:// ...), hồi scala 2.7 thì còn không support cả close. Đúng là cái gì đi kèm bao giờ cũng lởm =)).
Dùng hàng tuyển common IO thì cũng ok, nhưng bạn chỉ có đọc file vào và ghi file ra đơn giản mà dùng đến tận common IO thì không khác gì dùng dao mổ trâu để giết gà.
Dùng hàng có sẵn của java có vẻ là một sự lựa chọn an toàn.

Tuy nhiên thì khi dùng hàng của java.io thì có một cái mình vô cùng khó chịu là nó chỉ cho read theo chunk, tức là bạn phải

val in = new BufferedInputStream(new FileInputStream("sampledata.txt"))
while (var chunk = in.read()) { 
   //làm gì với cái chunk
}

Đã mất công làm việc với scala mà lại dùng while, lại phải tạo biến tạm mutalbe dùng chunk thì quá ư là bất tiện
Rất may scala đã có khái niệm và Iterator , mà đi kèm với nó đấy là hàm continually (tham khảo http://www.scala-lang.org/api/current/index.html#scala.collection.Iterator$)
Hàm này có mục đích là liên tiếp "evaluate" một cái gì đó, và trả về kết quả là một iterator khác.
Nhờ đó mà chúng ta có thể stream cái chuỗi đầu vào một cách cục kì dễ dàng, qua đó giúp chúng ta có thể xử lý cái vòng lặp while kia một cách gọn gàng hơn rất nhiều.

Ví dụ

val lines: Array[Byte] = Iterator.continually(in.read()).takeWhile(_ != null).toList.toArray
//làm gì đó với lines

Bạn có thể viết xử lý đọc từ stdin vào chỉ với one-liner

val bs = Iterator.continually(System.in.read()).takeWhile(_ != -1).map(_.toByte).toArray
println(new String(bs, "US-ASCII"))

Class Stream của scala cũng support xử lý hoàn toàn tương tự, bạn nào không thích Iterator thì có thể dùng Stream.

Functional programming rất tiện phải không :D.

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

huydx

116 bài viết.
939 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
148 14
Introduction (Link) là một cuộc thi ở Nhật, và cũng chỉ có riêng ở Nhật. Đây là một cuộc thi khá đặc trưng bởi sự thú vị của cách thi của nó, những...
huydx viết gần 2 năm trước
148 14
White
118 15
Happy programmer là gì nhỉ, chắc ai đọc xong title của bài post này cũng không hiểu ý mình định nói đến là gì :D. Đầu tiên với cá nhân mình thì hap...
huydx viết hơn 3 năm trước
118 15
White
95 10
(Ảnh) Mở đầu Chắc nhiều bạn đã nghe đến khái niệm oauth. Về cơ bản thì oauth là một phương thức chứng thực, mà nhờ đó một web service hay một ap...
huydx viết gần 3 năm trước
95 10
Bài viết liên quan
White
10 0
Kí tự Regex cơ bản Về cơ bản thì các sử lý matching của scala.util.matching.Regex sẽ được "phó thác" (delegate) cho java Regex. Bạn có thể tạo một ...
huydx viết 3 năm trước
10 0
White
7 1
Trong scala kí tự _ được dùng với khá nhiều mục đích .. không liên quan đến nhau. Tạm note lại cái đã khi nào có time sẽ quay lại viết cẩn thận sa...
huydx viết 3 năm trước
7 1
White
0 0
(Bài viết hơi khó hiểu, dành cho bạn nào có hứng thú với type programming trong scala với các thư viện như shapeless chẳng hạn) Thông thường với m...
huydx viết hơn 2 năm trước
0 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
116 bài viết.
939 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!