Regex Scala函数式编程概念,而不是多个for循环
我正在努力学习Scala中的函数式编程。现在我正在使用面向对象的方法,让for循环完成一项工作。我有两个列表Regex Scala函数式编程概念,而不是多个for循环,regex,scala,for-loop,collections,functional-programming,Regex,Scala,For Loop,Collections,Functional Programming,我正在努力学习Scala中的函数式编程。现在我正在使用面向对象的方法,让for循环完成一项工作。我有两个列表userCurrentRole和权利,我正在对它们进行双for循环: for { curr <- userCurrentRole { ent <- entitlements } { if (ent.userEmail.split("@")(0) == curr.head) { if (ent.roleName != cur
userCurrentRole
和权利
,我正在对它们进行双for循环:
for {
curr <- userCurrentRole {
ent <- entitlements
} {
if (ent.userEmail.split("@")(0) == curr.head) {
if (ent.roleName != curr(1)) {
grantOrRevoke += 1
grantList += SomeCaseClass(curr.head, ent.roleName)
}
}
}
}
用于{
curr你可以这样写:
val grantOrRevoke = userCurrentRole
.map(curr => entitlements
.filter(ent => ent.userEmail.split("@")(0) == curr.head && ent.roleName != curr(1))
.size)
.sum
好消息是:您已经在使用函数式了!因为for
本身不是一个循环,而是一个“for constansion”,它可以分解为flatMap
和map
调用。它只是更容易读/写
然而,您应该避免的是可变变量,比如
val revocations = for {
curr <- userCurrentRole {
ent <- entitlements
if ent.userEmail.split("@")(0) == curr.head
if ent.roleName != curr(1)
} yield {
1
}
revocations.size // same as revocations.sum
val revocations=for{
curr好吧,你已经在使用一些高阶函数了,只是你没有注意到,因为你相信这些函数是for循环的,但它们不是循环。它们只是调用map
&flatMap
的糖类语法。但是在你的例子中,foreach
,加上可变性,want并不能使它起作用。
我建议您查看一下scaladoc,您会发现集合有很多有用的方法。
例如,在这种情况下,我们可以使用count
和sum
val grantOrRevoke = userCurrentRole.iterator.map {
// Maybe it would be better to have a list of tuples instead of a list of lists.
case List(username, userRole) =>
entitlements.count { ent =>
(ent.userEmail.split("@", 2)(0) == username) && (ent.roleName == userRole)
}
}.sum
@Sparker0i只生成SomeCaseClass(curr.head,ent.roleName)
而不是1
,您将得到一个列表[SomeCaseClass]