Scala正确使用break来返回

Ada*_*ies 1 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
}
Run Code Online (Sandbox Code Playgroud)

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

Rex*_*err 9

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

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

但是,如果您发现自己经常这样做,那么您可能并未完全使用集合库.试试吧

authoritiesWrapper.iterator.exists(_.getAuthority == role)
Run Code Online (Sandbox Code Playgroud)

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

if (authority.getAuthority == role) return true
Run Code Online (Sandbox Code Playgroud)

什么时候选择?通常,如果可以,您应该使用集合库中的control-flow选项.它们通常是最快和最清晰的.等等,最快 - 为什么?这两个breakreturn(从内for需要封闭或其他方面-基本上任何事情,但ifwhilematch)实际上抛出这是抓住了无堆栈异常; 在break情况下,它通过捕获breakable,并在return它是由法抓到情况.创建堆栈跟踪非常慢,但即使是无堆栈异常也很慢.

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