假设我有一种方法需要另一种方法作为参数。是否可以为该参数发送对象的实例方法?我如何处理没有参数的方法?
我会写一些伪代码:
void myMethod1(callback<void,int> otherFunc); // imagine a function returning void, and taking a int parameter
void myMethod2(callback<int,void> otherFunc); // function returning void, not taking params
例如我有一个ArrayList,如下所示:
val a = new ArrayList()
如何将add
方法作为myMethod1
的参数发送,并将size
方法作为myMethod2
的参数发送?
答案 0 :(得分:5)
Scala中函数的类型表示为
(Types,To,Pass) => ReturnType
(如果只有一种类型可以传递,你可以省略parens),并且将方法转换为函数以传递给另一种方法的方法是
myObject.myMethod _
所以,把它们放在一起 - 并注意Java类的类型:
scala> def addMySize(adder: Int => Boolean, sizer: () => Int) = adder(sizer())
addMySize: ((Int) => Boolean,() => Int)Boolean
scala> val a = new java.util.ArrayList[Int]()
a: java.util.ArrayList[Int] = []
scala> addMySize(a.add _, a.size _)
res0: Boolean = true
scala> addMySize(a.add _, a.size _)
res1: Boolean = true
scala> println(a)
[0, 1]
(注意,ArrayList有一个add,它接受一个对象并返回一个boolean - 而不是一个返回void的。)
答案 1 :(得分:4)
def myMethod(callback : Int => Unit, size : => Int) = ...
myMethod(a.add _, a.size)
Void
通过类型Unit
表示。
编辑:通过=> Int
的上述使用,size
按名称传递,这意味着它在需要时始终会重新评估。
答案 2 :(得分:4)
我认为myMethod4
可能是你的意思:“是否有可能引用a.size并在需要时调用它?”。
def myMethod1(f: Int => Unit): Unit = f(1)
def myMethod2(f: () => Int): Unit = {
val value = f // f is function, taking no arguments, and returning an int.
// we invoke it here.
()
}
def myMethod3(f: => Int): Unit = {
val value = f // f is call by name parameter.
()
}
def myMethod4[A](f: A => Int, a: A): Unit = {
val value = f(a)
()
}
import java.util.ArrayList
val a = new ArrayList[Int](1)
myMethod1((i: Int) => a.add(i))
myMethod1(a.add(_)) // shorthand for the above
myMethod2(() => a.size) // a.size is not evaluated, it is enclosed in an anonymous function definition.
myMethod3(a.size) // a.size is not evaluated here, it is passed as a by-name parameter.
myMethod4((al: ArrayList[Int]) => al.size, a)
myMethod4((_: ArrayList[Int]).size, a)
myMethod4[ArrayList[Int]](_.size, a)