Это действительно, чтобы уменьшить на пустом наборе наборов? - PullRequest
10 голосов
/ 08 августа 2011

Разве это не должно работать?

> val setOfSets = Set[Set[String]]()    
setOfSets: scala.collection.immutable.Set[Set[String]] = Set()

> setOfSets reduce (_ union _)
java.lang.UnsupportedOperationException: empty.reduceLeft
  at scala.collection.TraversableOnce$class.reduceLeft(TraversableOnce.scala:152)
  [...]

Ответы [ 3 ]

20 голосов
/ 08 августа 2011

Уменьшение (влево и вправо) нельзя применить к пустой коллекции.

Концептуально:

myCollection.reduce(f)

похоже на:

myCollection.tail.fold( myCollection.head )( f )

Таким образом, коллекциядолжен иметь хотя бы один элемент.

12 голосов
/ 09 августа 2011

Это должно делать то, что вы хотите:

setOfSets.foldLeft(Set[String]())(_ union _)

Хотя я не понял требования не указывать порядок.

2 голосов
/ 02 октября 2018

Начиная с Scala 2.9, большинство коллекций теперь снабжены функцией reduceOption (эквивалент reduce), которая поддерживает случай пустых последовательностей, возвращая Option результата :

Set[Set[String]]().reduceOption(_ union _)
// Option[Set[String]] = None
Set[Set[String]]().reduceOption(_ union _).getOrElse(Set())
// Set[String] = Set()
Set(Set(1, 2, 3), Set(2, 3, 4), Set(5)).reduceOption(_ union _).getOrElse(Set())
// Set[Int] = Set(5, 1, 2, 3, 4)
...