我有以下代码:
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
的正确方法是什么?看起来不对我。
答案 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选项。它们通常是最快和最清晰的。等等,最快 - 为什么? break
和return
(来自for
或其他需要关闭的上下文 - 基本上只有if
和while
以及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 true
和return 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
。
如果这还不完美,请评论。