在这个 Java 类中:
import java.util.function.*;
public class T {
public String func(String a) {
System.out.println("There we go: " + a);
return a;
}
public static void main(String... args) {
final Supplier<T> c = T::new;
final BiFunction<T, String, String> f = T::func;
final T t = c.get();
final String v = f.apply(t, "something");
System.out.println(v);
}
}
我可以获得对 T
的构造函数和实例方法 func
的方法引用。
有没有办法在 Scala 中做同样的事情,即获取
val c: () => T = ??? // default constructor of T as function
val f: (T, String) => String = ??? // instance method func of T as function
没有像那样包装它们:
val c: () => T = () => new T
val f: (T, String) => String = (t, arg) => t.func(arg)
即有没有一种方法可以像 Java 8 一样优雅地获取构造函数和实例方法引用以获得这些东西的 Scala 函数?
最佳答案
首先,让我们看一下 Java 代码到 Scala 的直译:
class T {
def func(a:String) : String = {
println(s"There we go: $a")
a
}
}
object T {
def main(args: Array[String]) = {
val supplier = () => new T
val f = (t:T) => t.func _
val t = supplier()
val v = f(t)("something")
println(v)
}
}
在 Scala 中,函数是一等公民,因此不需要像 Java Supplier
那样对“生成的东西”进行特殊构造,因为它被建模为函数:f : () => T
(它的对应物 Consumer
与 f: T => ()
相同)
我们刚刚说过函数是一等公民,所以让我们看一下使用此范例的上述版本:
object Tfunc {
// let's remove the println side-effect from a function.
val func: String => String = a => s"There we go: $a"
def main(args: Array[String]) = {
println(func("something"))
}
}
在 Scala 中,没有获取构造函数引用的对应方法,但如果目标是使用函数式方法,Scala object
提供了一个简单的构造来保存函数并且不需要实例化.
关于java - 方法引用类似于 Scala 中的 Java 8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40398971/