Scala正确使用break来返回

时间:2013-01-15 17:40:17

标签: scala

我有以下代码:

private def hasRole(role: String): Boolean = {
  var hasRole = false;
  if(getUserDetails.isDefined){

    // getAuthorities returns java.util.Collection<GrantedAuthority>
    val authorities: util.Collection[_ <:GrantedAuthority] = getUserDetails.get.getAuthorities
    // Wrap the collection is a Scala class 
    val authoritiesWrapper = JCollectionWrapper.apply(authorities);
    for(authority <- authoritiesWrapper.iterator){
      if(authority.getAuthority == role){
        hasRole = true;
        scala.util.control.Breaks.break  
      }
    }
  }
  hasRole
}

问题是scala.util.control.Breaks.break找到角色时return的正确方法是什么?看起来不对我。

4 个答案:

答案 0 :(得分:9)

如果你想使用breakable,你需要这样做:

import scala.util.control.Breaks._
breakable {
  for (i <- 0 to 10000) { if (i>3) break }
}

但是如果你发现自己经常这样做,那么你可能并没有完全使用集合库。尝试改为

authoritiesWrapper.iterator.exists(_.getAuthority == role)

另外,在你给出的例子中,你也可以

if (authority.getAuthority == role) return true

何时选择哪个?通常,如果可以,您应该使用集合库中的control-flow选项。它们通常是最快和最清晰的。等等,最快 - 为什么? breakreturn(来自for或其他需要关闭的上下文 - 基本上只有ifwhile以及match )实际上抛出一个被捕获的无堆栈异常;在break案例中,它被breakable捕获,在return案例中,它被方法捕获。创建堆栈跟踪非常慢,但即使是无堆栈异常也很慢。

因此,使用正确的集合方法 - 在这种情况下为exists - 是最佳解决方案。

答案 1 :(得分:1)

  

问题是,scala.util.control.Breaks.break是正确的方法   当我找到这个角色时回归?看起来不对我。

由于您只是在寻找authority.getAuthority == role的第一个实例,因此您可以使用find来完成这一操作,这是执行此操作的惯用方法。

authoritiesWrapper.iterator.find(authority => authority.getAuthority == role)

或更简洁

authoritiesWrapper.iterator.find(_.getAuthority == role)

这些会返回Option类型,如果它存在,您可以获得authority的值。

答案 2 :(得分:0)

为什么不只是return truereturn false取代hasRole

答案 3 :(得分:0)

谢谢大家,根据@Rex Kerr回答,我现在有了这个:

private def hasRole(role: String): Boolean = {
  var hasRole: Boolean = false;
  if(getUserDetails.isDefined){
    val authorities: util.Collection[_ <:GrantedAuthority] = getUserDetails.get.getAuthorities
    val authoritiesWrapper = JCollectionWrapper.apply(authorities);
    hasRole = authoritiesWrapper.iterator.exists(_.getAuthority == role)
  }
  hasRole
}
看起来感觉正确的

。我使用exists来查看集合中存在的角色,然后返回该结果。默认情况下,如果未定义用户(未登录),则返回false

如果这还不完美,请评论。