减少一组空集是否有效?

gla*_*ded 10 collections reduce scala set

这不应该工作吗?

> 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)
  [...]
Run Code Online (Sandbox Code Playgroud)

par*_*tic 21

Reduce(左和右)不能应用于空集合.

概念:

myCollection.reduce(f)
Run Code Online (Sandbox Code Playgroud)

类似于:

myCollection.tail.fold( myCollection.head )( f )
Run Code Online (Sandbox Code Playgroud)

因此,集合必须至少有一个元素.

  • 恕我直言,Java8通过使`reduce`返回一个`Optional`而不是实际结果来做到这一点.因此,如果集合为空,则只返回"无"而不是运行时异常. (4认同)
  • 无论如何,我明白,reduce与空列表的想法根本不相容.而且我现在看到了scaladoc的局限性.它隐藏在"返回"部分:"在所有元素之间应用reduce运算符的结果_如果集合是非空的."我希望这已经预先说明了. (3认同)
  • @LionelPort 你是对的,但 `reduceOption` 也存在。 (2认同)

soc*_*soc 12

这应该做你想要的:

setOfSets.foldLeft(Set[String]())(_ union _)
Run Code Online (Sandbox Code Playgroud)

虽然我没有理解不指定订购的要求.

  • 建议你在Set [String]()上使用Set.empty [String],不需要创建空集的新实例. (7认同)

Xav*_*hot 7

从 开始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)
Run Code Online (Sandbox Code Playgroud)