レシーバが指定されたメソッド参照
// Javaコード
static class Calculator {
int succ(int x) { return x + 1; }
}
public static void main(final String... args) {
final Calculator c = new Calculator();
Optional.of(5).map(c::succ);
}
Slide 47
Slide 47 text
レシーバが指定されたメソッド参照
// Javaコード
static class Calculator {
int succ(int x) { return x + 1; }
}
public static void main(final String... args) {
final Calculator c = new Calculator();
Optional.of(5).map(c::succ);
}
「c」のsuccメソッド
Slide 48
Slide 48 text
一方、Kotlinは...
class Calculator {
fun succ(x: Int): Int = x + 1
}
val calc = Calculator()
2.let(calc::succ) // NG
2.let { calc.succ(it) } // こう書くしか…?
Slide 49
Slide 49 text
T.(A)->Rは、(T, A)->Rでもある!
class Calculator {
fun succ(x: Int): Int = x + 1
}
val a: Calculator.(Int)->Int = Calculator::succ
val b: (Calculator, Int)-> Int = a
Slide 50
Slide 50 text
T.(A)->Rは、(T, A)->Rでもある!
class Calculator {
fun succ(x: Int): Int = x + 1
}
val a: Calculator.(Int)->Int = Calculator::succ
val b: (Calculator, Int)-> Int = a
Slide 51
Slide 51 text
つまり
val calc = Calculator()
2.let(calc::succ) // NG
2.let { calc.succ(it) } // OK
2.let { (Calculator::succ)(calc, it) } // OK
Slide 52
Slide 52 text
さらに
val calc = Calculator()
2.let(calc::succ) // NG
2.let { calc.succ(it) } // OK
2.let { (Calculator::succ)(calc, it) } // OK
2.let((Calculator::succ)(calc)) // OK
Slide 53
Slide 53 text
さらに
val calc = Calculator()
2.let(calc::succ) // NG
2.let { calc.succ(it) } // OK
2.let { (Calculator::succ)(calc, it) } // OK
2.let((Calculator::succ)(calc)) // OK
既にカリー化する方法を知っているので、
it を省略して、ラムダ式を消せる!
Slide 54
Slide 54 text
ちょっと待った!!
class Calculator {
fun succ(x: Int): Int = x + 1
}
val calc = Calculator()
2.let(calc::succ) // NG
2.let { calc.succ(it) } // こう書くしか…?
Slide 55
Slide 55 text
ちょっと待った!!
class Calculator {
fun succ(x: Int): Int = x + 1
}
val calc = Calculator()
2.let(calc::succ) // OK ver1.1から
2.let { calc.succ(it) } // こう書くしか…?
ラムダ式禁止が捗るね!!