Bạn nên rất cẩn thận về bao giờ ngầm chuyển đổi một Iterator
thành một Iterable
(Tôi thường sử dụng Iterator.toList
- rõ ràng). Lý do cho điều này là, bằng cách chuyển kết quả vào một phương thức (hoặc hàm) mà mong đợi một Iterable
, bạn mất quyền kiểm soát nó ở mức độ chương trình của bạn có thể bị hỏng. Dưới đây là một ví dụ:
def printTwice(itr : Iterable[String]) : Unit = {
itr.foreach(println(_))
itr.foreach(println(_))
}
Nếu một Iterator
bằng cách nào đó mặc nhiên chuyển đổi thành một Iterable
, điều gì sẽ sau đây sẽ in?
printTwice(Iterator.single("Hello"))
Nó (dĩ nhiên) chỉ in Xin chào một lần. Rất gần đây, trait
TraversableOnce
đã được thêm vào thư viện bộ sưu tập, trong đó hợp nhất Iterator
và Iterable
. Theo tôi, đây có thể là một sai lầm.
sở thích cá nhân của tôi là sử dụng Iterator
rõ ràng bất cứ nơi nào có thể và sau đó sử dụng List
, Set
hoặc IndexedSeq
trực tiếp. Tôi đã tìm thấy rằng tôi hiếm khi có thể viết một phương pháp mà thực sự là bất khả tri của loại nó được thông qua. Một ví dụ:
def foo(trades: Iterable[Trade]) {
log.info("Processing %d trades", trades.toList.length) //hmmm, converted to a List
val shorts = trades.filter(_.side.isSellShort)
log.info("Found %d sell-short", shorts.toList.length) //hmmm, converted to a List again
//etc
Nguồn
2010-04-30 20:27:05
trùng lặp http://stackoverflow.com/questions/1072784/how-can-i-convert-a-java-iterable-to-a-scala-iterable – wheaties
@wheaties đây không phải là một trùng lặp với câu hỏi đó. –