我对"引用特定类型的任意对象的实例方法"背后的概念感到困惑.Oracle 文档有一个关于此的示例:
String[] stringArray = { "Barbara", "James", "Mary", "John", "Patricia", "Robert", "Michael", "Linda" };
Arrays.sort(stringArray, String::compareToIgnoreCase);
Run Code Online (Sandbox Code Playgroud)
我在这种方法参考中看到的大多数例子都是这样的:如果lambda是这样的:x -> x.func()那么你就可以这样写ClassOfX::func.文档中的示例说:
方法引用String :: compareToIgnoreCase的等效lambda表达式将具有形式参数列表(String a,String b),其中a和b是用于更好地描述此示例的任意名称.方法引用将调用方法a.compareToIgnoreCase(b).
现在的问题是:像任何两个参数的lambda (a, b) -> a.func(b)的func方法必须是第一个参数,拉姆达的第二个参数的实例方法将作为参数传递给该方法通过?如果我们有多个参数lambda那么func方法必须是lambda 的第一个参数的实例方法,而lambda的其他参数将按照lambda func中出现的顺序传递给它?我的意思是,而不是(a, b, c) -> a.func(b, c)我们可以写ClassOfA::func
对不起我的英语.我希望我能清楚地解决这个问题.
考虑下面的代码,
interface TestInter {
public void abc();
}
class DemoStatic {
public static void testStatic(String abc) {
System.out.println(abc);
}
public void runTest () {
// Using lambda expression.
String str = "demo string" ;
TestInter demo1 = () -> DemoStatic.testStatic(str);
demo1.abc();
// Using method reference.
TestInter demo2 = DemoStatic::testStatic; // This line is not compiling.
demo2.abc();
}
}
Run Code Online (Sandbox Code Playgroud)
如果这样的答案中描述的方法的参数将被消除,我们可以调用该testStatic方法作为TestInter接口实体的主体.abc()testStaic()
但在这种情况下,我们如何为参数化方法编写方法参考testStatic?