2017-07-28 61 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)