Java Stream с :: новым для Kotlin

Я пытаюсь преобразовать следующий код безопасности Spring из Java в Kotlin.

Ява:

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>()) 

Я получаю ошибку несоответствия типа ( Required: Function<in String!, out (???..???)>! ) На .map(SimpleGrantedAuthority()) . Как преобразовать вышеуказанный код Java в Kotlin с ключевым словом ::new правильно?

Использование 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) 

Вам нужно передать лямбда-выражение на тело map . Вы создали новый экземпляр SimpleGrantedAuthority вместо создания функции, которая возвращает новый экземпляр SimpleGrantedAuthority .

Это тонкая разница.

Чтобы исправить ваши проблемы, вы можете использовать ссылку на конструктор:

 .map(::SimpleGrantedAuthority) 

или определить выражение лямбда вручную:

 .map({ SimpleGrantedAuthority() }) 

Кроме того, вместо:

 claims.get(AUTHORITIES_KEY) 

ты можешь сделать:

 claims[AUTHORITIES_KEY] 

Вам действительно не нужно использовать Stream API в Котлине. Native Collections API достаточно мощный:

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