Conversión de methods de estilo de procedimiento a estilo funcional

Se supone que el código siguiente count los nodos negros atravesando los nodos de la izquierda desde la raíz hasta la parte inferior de un tree negro rojo. La cantidad de nodos negros se almacena en la variable black :

 fun isBalanced1(): Boolean { require(!isEmpty()) { "Cannot check empty tree for balance"} var x = root var black = 0 while(x != null) { if(!isRed(x)) { black++ } x = x.left } return isBalanced(root, black) } 

El estilo es de procedimiento y funciona bien.

Ahora, ¿cómo podría cambiar hacer lo mismo en un estilo más funcional?

Esto es lo que se me ocurrió:

 fun isBalanced1(): Boolean { require(!isEmpty()) { "Cannot check empty tree for balance" } val black = generateSequence(root) { node -> node.left } .takeWhile { node -> node != null } .filter { node -> !isRed(node) }.count() return isBalanced(root, black) } 

Utiliza un generador de secuencia para atravesar el tree mientras que un nodo no es null y luego filtra los negros y count todas las coincidencias.

¿Es este el enfoque correcto para convertir este código de cruce de tree o hay mejores alternativas en Kotlin?

Siguiendo los consejos dados en los comentarios, así es como debería verse el código:

 fun isBalanced(): Boolean { require(!isEmpty()) { "Cannot check empty tree for balance" } val blackCount = generateSequence(root) { node -> node.left } .count { !isRed(it) } return isBalanced(root, blackCount) } 

El método count() está en su propio párrafo para takeWhile lectura y takeWhile no es necesario.

  • En Kotlin, ¿es posible cambiar la delegación en Runtime?
  • Expresión en Kotlin
  • Kotlin 1.0.0-rc-1036 problemas con el procesamiento de annotations
  • test de unidad LogstashEncoder está configurado correctamente
  • ¿Cómo obtengo un número fijo de celdas de cambio de tamaño sin relleno en javafx?
  • Cualquier mejora de código en agregar / replace fragment
  • Kotlin - Continuar con la Corutina después de la Excepción
  • Prueba de la aplicación Android Kotlin: Mockito con Dagger inyecta nulo
  • SetChecked () no funciona
  • Reproductor de video flotante de estilo Youtube
  • Cómo get la class de un Any val