kotlinとラムダ/関数参照を使用しようとすると、私はコンパイルエラーに直面している:関数参照とラムダ
class Foo {
fun getFilteredList(){
val numbers = listOf(1, 2, 3)
numbers.filter(::isOdd) // prints [1, 3]
}
fun isOdd(x: Int): Boolean = x % 2 != 0
}
しかし、私は型の不一致を言って、コンパイル時のエラーを取得:
Error:(18, 16) Gradle: Type inference failed: inline fun kotlin.Iterable.filter(predicate: (T) -> kotlin.Boolean): kotlin.List cannot be applied to receiver: kotlin.List arguments: (kotlin.reflect.KFunction2) Error:(18, 23) Gradle: Type mismatch: inferred type is kotlin.reflect.KFunction2 but (kotlin.Int) -> ??? was expected Error:(18, 23) Gradle: Type mismatch: inferred type is kotlin.reflect.KFunction2 but (kotlin.Int) -> kotlin.Boolean was expected Error:(18, 25) Gradle: Left-hand side of a callable reference with a receiver parameter cannot be empty. Please specify the type of the receiver before '::' explicitly
'::'の前に明示的に指定する必要があるエラーとそのタイプはわかりません
別の質問 kotliのリファレンスとして別のオブジェクト関数を使用できますかn?このようなもの:
class Bar {
fun isOdd(x: Int): Boolean = x % 2 != 0
}
class Foo {
fun getFilteredList(){
val bar = Bar()
val numbers = listOf(1, 2, 3)
numbers.filter(bar::isOdd) // Use Bar's method
}
}
テストのために便利でしょう。私がラムダを直接渡すと、ラムダそのものを単体テストする本当の方法はありません。したがって、私は関数を使う方法を探していました。なぜなら、関数自体は単体テスト可能であるからです。私が見ている限り、クラス内で関数を定義することもできます: 'class Foo {val isOdd = fun(i:Int):Boolean {return i%2!= 0}}'。クラスFooでは、ラムダの代わりに 'isOdd'を渡すことができ、isOddはまだユニットテスト可能です。しかし、これは回避策のようです。 Java 8と同様の関数参照を単体テストのために使ってもいいですか? – sockeqwe
@udalovローカル関数の意味は?どのように作成するのですか?ラムダによって? – voddan
ローカル関数は、別の関数内で宣言された関数です。https://kotlinlang.org/docs/reference/functions.html#local-functionsを参照してください。 –