[英]Scala: lazily composing iterators
假設我有一個電子表格對象,該對象由一個行迭代器組成,每行本身都是一個單元格上的迭代器。 我想創建一個接受電子表格迭代器並通過Cells返回迭代器的函數。
最簡單的版本是這樣的:
val sheet: Iterable[Row] = //some way of getting the sheet.
case class SheetCell(rowIndex: Int, colIndex: Int, value: Any)
val itr = Iterator(sheet map {row: Row =>
row map {cell: Cell => SheetCell(row.getRowNum, cell.getColumnIndex, cell)}
})
但是,我也很想這樣做。 即沒有實際將整個電子表格讀取到內存中,也沒有實際遍歷行/單元迭代器,我的理解是上面的代碼並不是很懶。 我非常確定它會遍歷行/單元格迭代器,在內存中構建一個List[SheetCell]
對象,然后將其轉換為迭代器-這很不好。
如何以最小化資源使用的方式來做到這一點? 我應該以某種方式使用視圖嗎? 我該怎么做?
更一般而言,如何懶惰地構成迭代器?
您的代碼是懶惰的,只是沒有執行您想要的。
首先, Iterator(x)
不會將x變成Iterator,它會創建一個以x為唯一元素的單元素Iterator。 x.toIterator
將x變成一個迭代器。
其次,您不需要這樣做,因為Iterator.map
已經很懶惰了,可以返回Iterator( doc )。
最后,如果要展平為單個Iterator,請改用flatMap:
sheet.flatMap { row =>
row.map { cell => SheetCell(row.getRowNum, cell.getColumnIndex, cell) }
}
或者,對於理解:
for (row <- sheet; cell <- row) yield
SheetCell(row.getRowNum, cell.getColumnIndex, cell)
如果只需要Iterator[Cell]
,則可以執行sheet.flatten
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.