我有几个预先设定的静态处理器"实现相同的方法,例如:
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));
}
...
现在假设我有一些对象可以提供额外的&#34;处理器列表&#34;。
我尝试使用interface
来定义其他&#34;处理器&#34;。
static interface IProcessor{
double process(double num);
}
使用额外的&#34;处理器实现对象&#34;:
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
那么请你告诉我是否可以这样做,如果是的话怎么样? 如果不可能,我应该怎么做?
答案 0 :(得分:7)
test(SomeObject.getExtraProccessors()::process, 1);
SomeObject.getExtraProccessors()
returns an instance of functional interface IProcessor
.SomeObject::getExtraProccessors
is a method reference to the static method getExtraProccessor
of the SomeObject
class.答案 1 :(得分:3)
How about using a lambda expression instead of method reference :
test(d-> SomeObject.getExtraProccessors().process(d), 1d);
答案 2 :(得分:2)
我认为您不需要创建实现IProcessor
的匿名内部类实例。实际上,如果您要使用double
进行操作,则根本不需要IProcessor
界面。 Java提供的DoubleUnaryOperator
接口完全就是为了这个接口。
如果您想返回&#34;处理器&#34;的列表,那么您可以这样做:
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);