我有一个不变的集合,该集合跟踪一组订户。这是添加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
来做到这一点?
答案 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)
在您的集合上使用var
与val
。然后,您可以执行以下操作来检查该属性,如果不存在,请添加它。
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