Java Stream with :: new to Kotlin

我试图将以下Spring Security代码从Java转换为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?

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

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

但是在Kotlin你可以做得更好:

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

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

这是一个微妙的差异。

为了解决您的问题,您可以使用对构造函数的引用:

 .map(::SimpleGrantedAuthority) 

或者手工定义一个lambda表达式:

 .map({ SimpleGrantedAuthority() }) 

另外,而不是:

 claims.get(AUTHORITIES_KEY) 

你可以做:

 claims[AUTHORITIES_KEY] 

您并不需要在Kotlin中使用Stream API。 Native Collections API足够强大:

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