2010-07-29 26 views

Trả lời

46

Chế độ xem là các phiên bản không nghiêm ngặt của bộ sưu tập. Điều này có nghĩa rằng các yếu tố được tính toán khi truy cập và không háo hức như trong các bộ sưu tập thông thường.

Như một ví dụ lấy đoạn mã sau:

val xs = List.tabulate(5)(_ + 1) 
val ys = xs.view map { x => println(x); x * x } 

Chỉ cần điều này sẽ không in bất cứ điều gì nhưng mỗi quyền truy cập vào danh sách sẽ thực hiện việc tính toán và in giá trị, tức là mỗi cuộc gọi đến ys.head sẽ dẫn đến 1 phúc in. Nếu bạn muốn nhận lại phiên bản nghiêm ngặt của bộ sưu tập, bạn có thể gọi force trên đó. Trong trường hợp này, bạn sẽ thấy tất cả các số được in ra.

Một lần sử dụng cho chế độ xem là khi bạn cần duyệt qua một tập hợp các giá trị tốn kém để tính toán và bạn chỉ cần một giá trị tại một thời điểm. Các khung nhìn cũng cho phép bạn xây dựng các trình tự lười biếng bằng cách gọi số toStream trên chúng cũng sẽ lưu vào bộ nhớ cache các phần tử được đánh giá.

8

Xem Views từ Scala 2.8 Collections API.

Bộ sưu tập Scala theo mặc định là nghiêm ngặt trong tất cả các máy biến áp của chúng, ngoại trừ Stream, thực hiện tất cả các phương pháp biến áp của nó một cách lười biếng. Tuy nhiên, có một cách có hệ thống để biến mọi bộ sưu tập thành một bộ sưu tập lười và ngược lại, dựa trên chế độ xem bộ sưu tập. A xem là một loại bộ sưu tập đặc biệt đại diện cho một số bộ sưu tập cơ sở, nhưng thực hiện tất cả các máy biến áp một cách lười biếng.

...

Có hai lý do khiến bạn có thể muốn xem xét sử dụng chế độ xem. Đầu tiên là hiệu suất. Bạn đã thấy rằng bằng cách chuyển đổi một bộ sưu tập để xem một kết cấu trung gian có thể tránh được. Những khoản tiết kiệm này có thể khá quan trọng.

...

Trường hợp sử dụng thứ hai áp dụng cho lượt xem qua các chuỗi có thể thay đổi. Nhiều chức năng biến áp trên các khung nhìn như vậy cung cấp một cửa sổ vào chuỗi gốc mà sau đó có thể được sử dụng để cập nhật một số phần tử có chọn lọc của chuỗi đó.

10

Một trường hợp sử dụng là khi bạn cần phải thu thập kết quả đầu tiên của các yếu tố chuyển đổi:

case class Transform(n: Int) { println("Transform "+n)} 
    val list = List(1,2,3,4,5) 
    list.view.map(v => Transform(v)).collectFirst{case Transform(3) => println("found")} 

Prints:

Transform 1 
Transform 2 
Transform 3 
found 

Trong khi:

list.map(v => Transform(v)).collectFirst{case Transform(3) => println("found")} 

Prints:

Transform 1 
Transform 2 
Transform 3 
Transform 4 
Transform 5 
found 
Các vấn đề liên quan