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)