我有以下代码:
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吗?看起来不对我.
如果你想使用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选项.它们通常是最快和最清晰的.等等,最快 - 为什么?这两个break和return(从内for需要封闭或其他方面-基本上任何事情,但if和while和match)实际上抛出这是抓住了无堆栈异常; 在break情况下,它通过捕获breakable,并在return它是由法抓到情况.创建堆栈跟踪非常慢,但即使是无堆栈异常也很慢.
因此,使用正确的收集方法 - exists在这种情况下 - 是最佳解决方案.
| 归档时间: |
|
| 查看次数: |
1418 次 |
| 最近记录: |