Regex 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

我正在努力学习Scala中的函数式编程。现在我正在使用面向对象的方法,让for循环完成一项工作。我有两个列表
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]