对返回接口的方法的静态引用(带 :: )
Static reference ( with :: ) to a method returning an interface
我有几个预定义的静态 "processors" 实现相同的方法,例如:
default double process(double num){
样本:
public class Test {
public static void main(String[] args) {
test(Test::processor1, 1d);
test(Test::processor2, 1d);
}
static double processor1(double num){
return num * 10;
}
static double processor2(double num){
return num * 20;
}
//...
static void test(Function<Double, Double> f, double d){
// Do something util here
System.out.println(f.apply(d));
}
...
现在假设我有一些对象可以提供额外的列表 "processors"。
我正在尝试使用 interface
来定义那些额外的 "processors"。
static interface IProcessor{
double process(double num);
}
实现一个带有额外的对象"processors":
static class SomeObject{
// Just return one but should be a list...
static IProcessor getExtraProccessors(){
return new IProcessor(){
public double process(double num){
return num * 30;
}
};
}
}
这里所有的东西都可以编译并且工作正常。但现在我卡住了。
使用 SomeObject::getExtraProccessors
我有一个返回接口的静态方法的引用,我如何调用接口的方法?
我的第一次尝试是
test(SomeObject::getExtraProccessors::process, 1d);
但这不会编译给出 The target type of this expression must be a functional interface
所以请你告诉我是否可以这样做,如果可以的话怎么做?
如果不可能,我应该怎么做?
test(SomeObject.getExtraProccessors()::process, 1);
SomeObject.getExtraProccessors()
returns 函数接口实例 IProcessor
.
SomeObject::getExtraProccessors
是对SomeObject
class. 的静态方法getExtraProccessor
的方法引用
如何使用 lambda 表达式而不是方法引用:
test(d-> SomeObject.getExtraProccessors().process(d), 1d);
我认为您不需要创建实现 IProcessor
的匿名内部 class 实例。实际上,如果您要使用 double
进行操作,则根本不需要 IProcessor
接口。 Java 提供了 DoubleUnaryOperator
接口,正是为此而设计的。
如果你想return一个"processors"的列表,那么你可以这样做:
static class SomeObject {
static List<DoubleUnaryOperator> getExtraProccessors() {
return new ArrayList<>(Arrays.asList(Test::processor1, Test::processor2));
}
}
然后,假设您将 test
方法更改为:
static void test(DoubleUnaryOperator f, double d) {
// Do something util here
System.out.println(f.applyAsDouble(d));
}
您可以按如下方式使用它:
test(SomeObject.getExtraProcessors().get(0), 1);
我有几个预定义的静态 "processors" 实现相同的方法,例如:
default double process(double num){
样本:
public class Test {
public static void main(String[] args) {
test(Test::processor1, 1d);
test(Test::processor2, 1d);
}
static double processor1(double num){
return num * 10;
}
static double processor2(double num){
return num * 20;
}
//...
static void test(Function<Double, Double> f, double d){
// Do something util here
System.out.println(f.apply(d));
}
...
现在假设我有一些对象可以提供额外的列表 "processors"。
我正在尝试使用 interface
来定义那些额外的 "processors"。
static interface IProcessor{
double process(double num);
}
实现一个带有额外的对象"processors":
static class SomeObject{
// Just return one but should be a list...
static IProcessor getExtraProccessors(){
return new IProcessor(){
public double process(double num){
return num * 30;
}
};
}
}
这里所有的东西都可以编译并且工作正常。但现在我卡住了。
使用 SomeObject::getExtraProccessors
我有一个返回接口的静态方法的引用,我如何调用接口的方法?
我的第一次尝试是
test(SomeObject::getExtraProccessors::process, 1d);
但这不会编译给出 The target type of this expression must be a functional interface
所以请你告诉我是否可以这样做,如果可以的话怎么做? 如果不可能,我应该怎么做?
test(SomeObject.getExtraProccessors()::process, 1);
SomeObject.getExtraProccessors()
returns 函数接口实例IProcessor
.SomeObject::getExtraProccessors
是对SomeObject
class. 的静态方法
getExtraProccessor
的方法引用
如何使用 lambda 表达式而不是方法引用:
test(d-> SomeObject.getExtraProccessors().process(d), 1d);
我认为您不需要创建实现 IProcessor
的匿名内部 class 实例。实际上,如果您要使用 double
进行操作,则根本不需要 IProcessor
接口。 Java 提供了 DoubleUnaryOperator
接口,正是为此而设计的。
如果你想return一个"processors"的列表,那么你可以这样做:
static class SomeObject {
static List<DoubleUnaryOperator> getExtraProccessors() {
return new ArrayList<>(Arrays.asList(Test::processor1, Test::processor2));
}
}
然后,假设您将 test
方法更改为:
static void test(DoubleUnaryOperator f, double d) {
// Do something util here
System.out.println(f.applyAsDouble(d));
}
您可以按如下方式使用它:
test(SomeObject.getExtraProcessors().get(0), 1);