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) 
  • Componer configuraciones navegables usando la DSL funcional de Kotlin
  • El file spring-configuration-metadata.json no se genera en IntelliJ Idea for Kotlin @ConfigurationProperties class
  • Usando @ EnableNeo4jRepositories (basePackageClasses = "myApp") en Kotlin
  • Configuración de security de spring de Kotlin
  • @Autowinetworking no funciona en el parámetro de método
  • Probar los methods @Async de devolución de vacío de Testing
  • Kotlin & Hibernate IllegalArgumentException: no se puede establecer el campo String Job.name en Job
  • Configurar un proyecto Spring Boot con Kotlin
  • (Java + Kotlin) Autocableo: se espera al less 1 bean que califique como candidato de autowire para esta dependencia
  • Spring Boot with AsyncRestTemplate Netty Client falla
  • ¿Cómo verificar si Mono está vacío?