Java Stream con :: nuevo en Kotlin

Estoy tratando de convertir el siguiente código de Spring Security de Java a Kotlin.

Java:

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

Kotlin:

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

Aparece un error de tipo No coincidencia ( Requinetworking: Function<in String!, out (???..???)>! ) En .map(SimpleGrantedAuthority()) . ¿Cómo convierto correctamente el código Java anterior a Kotlin con una ::new palabra key ::new ?

El uso de Arrays.stream no hace que el código sea muy legible:

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

Sin embargo, en Kotlin puedes hacerlo mejor:

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

Debes pasar una expresión lambda al cuerpo del map . Lo que hizo allí fue crear una nueva instancia de SimpleGrantedAuthority lugar de crear una function que devuelva una nueva instancia de SimpleGrantedAuthority .

Es una diferencia sutil.

Para solucionar sus problemas, puede usar una reference al constructor:

 .map(::SimpleGrantedAuthority) 

o define una expresión lambda a mano:

 .map({ SimpleGrantedAuthority() }) 

Además, en lugar de:

 claims.get(AUTHORITIES_KEY) 

tu puedes hacer:

 claims[AUTHORITIES_KEY] 

Realmente no necesita usar Stream API en Kotlin. Native Collections API es lo suficientemente potente:

  val auths = claims[AUTHORITIES_KEY].toString() .split(",") .filterNot(String::isEmpty) .map(::SimpleGrantedAuthority) 
  • Spring Data JPA / Hibernate "No se puede ubicar Attribute con el nombre de stack"
  • Probar los methods @Async de devolución de vacío de Testing
  • El file spring-configuration-metadata.json no se genera en IntelliJ Idea for Kotlin @ConfigurationProperties class
  • JUnit, @ControllerAdvice y la falta de excepciones marcadas en Kotlin
  • La desconnection no funciona en la aplicación Spring Boot (no es compatible con el método POST)
  • Los numbers en kotlin no son serializables
  • Spring JPA no puede asignar un campo con un setter personalizado en una class de datos de Kotlin
  • Configuración de security de spring de Kotlin
  • El mismo extremo de reposo con diferentes PathVariable
  • Spring Boot @ Autoajustado con Kotlin en @Service siempre es nulo
  • Cómo inyectar el context DSL de JOOQ en la class Kotlin