方法参考,如Scala中的Java 8

scr*_*avy 5 java methods lambda scala method-reference

在这个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);
    }

}
Run Code Online (Sandbox Code Playgroud)

我可以获得T对实例方法的构造函数的方法引用func.

有没有办法在scala中做同样的事情,即得到

val c: () => T = ??? // default constructor of T as function
val f: (T, String) => String = ??? // instance method func of T as function
Run Code Online (Sandbox Code Playgroud)

没有包装它们:

val c: () => T = () => new T
val f: (T, String) => String = (t, arg) => t.func(arg)
Run Code Online (Sandbox Code Playgroud)

即有没有像Java 8那样优雅的方式获取构造函数和实例方法引用来获取这些东西的scala函数?

Tia*_*gel 2

就像你在 java 8 中所做的那样,你不能。对于类构造函数,我认为除了您所做的之外,没有其他方法可以做到这一点。

对于函数,您可以使用我认为“更干净”的参数占位符。

var t = new T()
var func = t.func _
func("a")
Run Code Online (Sandbox Code Playgroud)

如果您使用 acase class那么您可以使用该apply方法。

case class C(a: String)
var d = C.apply _
d("c")
Run Code Online (Sandbox Code Playgroud)

您也可以apply在普通类中使用该函数,但您必须自己实现它。对于案例类,它们是自动实现的。