2017-07-28 62 views
3

我试图将以下Spring Security代码从Java转换为Kotlin。Java Stream with :: new to Kotlin

的Java:

Collection<? extends GrantedAuthority> authorities = 
     Arrays.stream(claims.get(AUTHORITIES_KEY).toString().split(",")) 
      .map(SimpleGrantedAuthority::new) 
      .collect(Collectors.toList()); 

科特林:

val authorities = Arrays.stream(claims[AUTHORITIES_KEY].toString().split(",".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()) 
     .map(SimpleGrantedAuthority()) 
     .collect(Collectors.toList<SimpleGrantedAuthority>()) 

我得到一个.map(SimpleGrantedAuthority())类型不匹配错误(Required: Function<in String!, out (???..???)>!)。如何正确使用::new关键字将上述Java代码转换为Kotlin?

+2

使用':: SimpleGrantedAuthority'代替它相当于java中的'SimpleGrantedAuthority :: new'。 –

回答

5

使用Arrays.stream不会使代码可读性超:

val authorities = Arrays.stream(claims.get(AUTHORITIES_KEY).toString().split(",").toTypedArray()) 
    .map(::SimpleGrantedAuthority).collect(Collectors.toList<SimpleGrantedAuthority>()) 

但是在科特林你可以做的更好:

val authorities = claims.get(AUTHORITIES_KEY).toString() 
       .split(",").filterNot { it.isEmpty() } 
       .map(::SimpleGrantedAuthority) 
1

你需要传递一个lambda表达式map的身体。你在那里做的是创建一个SimpleGrantedAuthority的新实例,而不是创建一个返回SimpleGrantedAuthority的新实例的函数。

这是一个微妙的区别。

为了解决你的问题,你可以用它来构造参考:

.map(::SimpleGrantedAuthority) 

或手工定义lambda表达式:

.map({ SimpleGrantedAuthority() }) 

另外,代替:

claims.get(AUTHORITIES_KEY) 

你可以这样做:

claims[AUTHORITIES_KEY] 

你并不真的需要使用流API在科特林。 Native Collections API足够强大:

val auths = claims[AUTHORITIES_KEY].toString() 
    .split(",") 
    .filterNot(String::isEmpty) 
    .map(::SimpleGrantedAuthority)