如何将元素惯用地添加到不可变集中并获得成功?

时间:2018-12-14 17:06:20

标签: scala

我有一个不变的集合,该集合跟踪一组订户。这是添加Subs并返回布尔值以指示是否实际处理订阅的方法:

var subs = Set.empty[Sub]
def addSub(addr: String, sub: Sub): Boolean = {
  if(subs.contains(sub)) {
    false
  }
  else {
    subscribe(addr)
    subs += sub
    true
  }
}

但是,此代码非常“类似于Java”。我试图使它更具有Scala / Functional的功能,但找不到方法,因为Scala中的赋值不会返回值,因此subs += sub必须位于其自己的代码行中,并使其看起来像Java。我应该怎么做才能改善它?

我知道mutable.Set.add()实际上返回布尔值。但是如何使用immutable.Set来做到这一点?

2 个答案:

答案 0 :(得分:3)

Scala /功能性方法是尽可能使用局部范围,以使所有内容保持不变并避免副作用。

def addSub(addr :String, sub :Sub, subs :Set[Sub]): (Boolean, Set[Sub]) = {
  if(!subs(sub)) subscribe(addr)
  (!subs(sub), subs + sub)
}

用法:

val (subAdded, newSubs) = addSub(address, subscriber, oldSubs)

答案 1 :(得分:0)

在您的集合上使用varval。然后,您可以执行以下操作来检查该属性,如果不存在,请添加它。

var set = Set.empty[Sub]
set
  .find(_ == newVal) // checks for the property and converts to an Option[Sub] presence
  .fold[Boolean] {
    set = set + newVal // property is not in set, add and return true
    true
  }(_ => false) // property is set, return false