函数在Java8中如何获取Cls::func的引用(Cls-Cls)返回Object



我使用以下测试用例来测试java.util.function.function.

public class TestFunc {
public String nonStaticFunc1 () {
return "nonStaticAndPara of fun1";
}
public String nonStaticFunc1 (TestFunc tf) {
return "nonStaticWithPara of fun1";
}
public String nonStaticFunc2 (TestFunc tf) {
return "nonStaticWithPara of fun2";
}
@Test
public void testFunc () {
Function<TestFunc, String> func = TestFunc::nonStaticFunc1;
System.out.println(func.apply(new TestFunc()));
// Cannot make a static reference to the non-static method nonStaticFunc2(TestFunc) from the type TestFunc
// Function<TestFunc, String> func2 = TestFunc::nonStaticFunc2;
}
}
/* OUTPUT
nonStaticAndPara of fun1
*///:~

始终对应于TestFunc::nonStaticFunc1(void(的函数返回String;我检查了函数源代码:

public interface Function<T, R> {
R apply(T t);
}

似乎当函数的参数为空时,java会自动将类对象导入其中。那么我如何获得TestFunc::nonStaticFunc1(TestFunc(呢?提前谢谢。

这是非常错误的。

java自动导入类对象

它是用面向对象编程语言进行的函数式编程。有必要知道您正在使用或调用哪个对象。

我不是讲师,所以让我们稍后再解释,看看我修改后的代码:

import java.util.function.Function;
public class TestFunc {
private final String name;
public String getName() {
return name;
}
public TestFunc(String name) {
this.name = name;
}
public String nonStaticFunc1() {
return "nonStaticAndPara of fun1 (no further parameter): " + this.name;
}
public String nonStaticFunc1(TestFunc parameter) {
// parameter is received but ignored
return "nonStaticWithPara of fun1 (parameter is received but ignored): " + this.name;
}
public String nonStaticFunc2(TestFunc parameter) {
// parameter is received and used
return "nonStaticWithPara of fun2 (parameter is received and used): " + parameter.getName();
}
public void testFunc(TestFunc parameter) {
Function<TestFunc, String> func;
func = TestFunc::nonStaticFunc1;
System.out.println(func.apply(parameter));
func = testFunc -> testFunc.nonStaticFunc1();
System.out.println(func.apply(parameter));
// TestFunc::nonStaticFunc1
// means
// calling nonStaticFunc1 from the parameter as in `apply(parameter)`
func = this::nonStaticFunc1;
System.out.println(func.apply(parameter));
func = testFunc -> this.nonStaticFunc1(testFunc);
System.out.println(func.apply(parameter));
// this::nonStaticFunc1
// means
// this.nonStaticFunc1(testFunc)
// similarly func2
func = this::nonStaticFunc2;
System.out.println(func.apply(parameter));
func = testFunc -> this.nonStaticFunc2(testFunc);
System.out.println(func.apply(parameter));
// func = TestFunc::nonStaticFunc2; // doesn't make sense, there's no such thing as parameter of the parameter
}
public static void main(String[] args) {
TestFunc parameter = new TestFunc("param");
TestFunc caller = new TestFunc("caller");
caller.testFunc(parameter);
}
}

输出:

nonStaticAndPara of fun1 (no further parameter): param
nonStaticAndPara of fun1 (no further parameter): param
nonStaticWithPara of fun1 (parameter is received but ignored): caller
nonStaticWithPara of fun1 (parameter is received but ignored): caller
nonStaticWithPara of fun2 (parameter is received and used): param
nonStaticWithPara of fun2 (parameter is received and used): param

我在代码中留下了一些注释作为注释来解释一些基本逻辑。我希望你熟悉lambda。

EDIT:减少示例代码中的对象数量EDIT2:更改nonStaticFunc2的工作方式(现在改为使用参数(

最新更新