Comportamiento con Kotlin Higher-Order Functions e interfaces de método único?

Estaba teniendo problemas al usar RxJava y Kotlin anteriormente. Hice algunos descubrimientos interesantes sobre los que todavía estoy desconcertado.

Existe la interfaz simple Func1 en RxJava

 public interface Func1<T, R> extends Function { R call(T t); } 

Estaba intentando agregar un método de extensión a un Observable , también una class RxJava. Esto recogería las emisiones en un map de Func1 Google Guava utilizando un Func1 para mapear la key de cada elemento.

 fun <K,T> Observable<T>.toImmutableListMultimap(keyMapper: Func1<T, K>): Observable<ImmutableListMultimap<K,T>> { return this.collect({ ImmutableListMultimap.builder<K,T>()},{ b, t -> b.put(keyMapper.call(t), t)}).map { it.build() } } 

Cuando traté de invocar este método de extensión, no pude hacer que comstackra, y no entendía la expresión lambda en absoluto.

 ScheduledItem.all.flatMap { it.rebuildSoftTransactions } .toImmutableListMultimap { it.id /*compile error */ } .cache() 

Sin embargo, lo más extraño sucedió cuando modifiqué el método de extensión para usar el tipo de function .

 fun <K,T> Observable<T>.toImmutableListMultimap(keyMapper: (T) -> K): Observable<ImmutableListMultimap<K,T>> { return this.collect({ ImmutableListMultimap.builder<K,T>()},{ b, t -> b.put(keyMapper(t), t)}).map { it.build() } } 

Y luego todo compiló bien. Pero esto es lo que me dejó perplejo: ¿cómo es que no infería el lambda en la interfaz? Cuando uso el método estándar map() en el Observable , infiere lambda simplemente usando la syntax { } corchete. Pero, ¿por qué no funciona para mi método de extensión anterior?