scala.collection.breakOut vs views

后端 未结 4 959
北海茫月
北海茫月 2021-02-19 08:01

This SO answer describes how scala.collection.breakOut can be used to prevent creating wasteful intermediate collections. For example, here we create an intermediat

4条回答
  •  爱一瞬间的悲伤
    2021-02-19 08:27

    What flavian said.

    One use case for views is to conserve memory. For example, if you had a million-character-long string original, and needed to use, one by one, all of the million suffixes of that string, you might use a collection of

    val v = original.view
    val suffixes = v.tails
    

    views on the original string. Then you might loop over the suffixes one by one, using suffix.force() to convert them back to strings within the loop, thus only holding one in memory at a time. Of course, you could do the same thing by iterating with your own loop over the indices of the original string, rather than creating any kind of collection of the suffixes.

    Another use-case is when creation of the derived objects is expensive, you need them in a collection (say, as values in a map), but you only will access a few, and you don't know which ones.

    If you really have a case where picking between them makes sense, prefer breakOut unless there's a good argument for using view (like those above).

    • Views require more code changes and care than breakOut, in that you need to add force() where needed. Depending on context, failure to do so is often only detected at run-time. With breakOut, generally if it compiles, it's right.
    • In cases where view does not apply, breakOut will be faster, since view generation and forcing is skipped.
    • If you use a debugger, you can inspect the collection contents, which you can't meaningfully do with a collection of views.

提交回复
热议问题