簡體   English   中英

Scala:懶惰地組成迭代器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM