gpt4 book ai didi

java - 如何使用方法引用调用参数化方法

转载 作者:行者123 更新时间:2023-12-01 15:22:07 26 4
gpt4 key购买 nike

考虑下面的代码,

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();
}
}

我们可以调用 testStatic方法作为 TestInter 的正文界面的abc() testStaic() 的参数实现方法将被删除,如 this so answer 中所述.

但在这种情况下,我们如何为参数化方法编写方法引用testStatic

最佳答案

您的功能接口(interface) TestInter 没有与您的 testStatic(String) 方法对应的签名。如果你想使用 :: 符号引用 testStatic(),你应该添加参数:

interface TestInter2 {
public void abc(String abc);
}

public void runTest () {
TestInter2 demo2 = DemoStatic::testStatic;
demo2.abc(str);
}

根据 Oracle Java tutorial ,有四种方法引用:

Four Types of Method Reference

我准备了 3 个接口(interface) - 用于 0、1 和 2 参数。然后我们有 3 个静态方法和 3 个实例方法:

interface F0 {
void f0();
}
interface F1 {
void f1(MetRef i1);
}
interface F2 {
void f2(MetRef i1, MetRef i2);
}

public class MetRef {
public static void stat0() {;}
public static void stat1(MetRef a) {;}
public static void stat2(MetRef a, MetRef b) {;}

public void inst0() {;}
public void inst1(MetRef a) {;}
public void inst2(MetRef a, MetRef b) {;}
}

现在看看每种方法如何在各种组合中用作方法引用,并将它们与上表进行比较。查看不同的方法引用类型并注意参数的来源。

public class Test {
public static void main(String[] args) {
final MetRef mr = new MetRef();

final F0 mr01 = MetRef::stat0; // 1: f0() ~ MetRef.stat0()
final F0 mr02 = mr::inst0; // 2: f0() ~ mr.inst0()
final F0 mr04 = MetRef::new; // 4: f0() ~ new MetRef()

final F1 mr11 = MetRef::stat1; // 1: f1(i1) ~ MetRef.stat1(i1)
final F1 mr12 = mr::inst1; // 2: f1(i1) ~ mr.inst1(i1)
final F1 mr13 = MetRef::inst0; // 3: f1(i1) ~ i1.inst0() <== NOTICE!

final F2 mr21 = MetRef::stat2; // 1: f2(i1, i2) ~ MetRef.stat2(i1, i2)
final F2 mr22 = mr::inst2; // 2: f2(i1, i2) ~ mr.inst2(i1, i2)
final F2 mr23 = MetRef::inst1; // 3: f2(i1, i2) ~ i1.inst1(i2) <== NOTICE!
}
}

关于java - 如何使用方法引用调用参数化方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23023618/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com