Java 8推迟执行方法



我有类似的类层次结构:

public abstract class AbstractFoo {
    abstractMethod(/*parameters*/) {
        //do something;
    }
}
public class Foo extends AbstractFoo {
    public String doSomething(int id, int value, FooB b, FooC c) {
        //do something;
    }
    public void doSomethingElse() {
        abstractMethod(param1, param2);
    }
}

我希望能够将doSomething方法作为方法参数传递给abstractMethod。我尝试了这样的事情:

public abstract class AbstractFoo {
    abstractMethod(/*parameters*/, Callable<String> method) {
        //do something;
        method.call();
    }
}
public class Foo extends AbstractFoo {
    Callable<String> doSomething = (int id, int value, FooB b, FooC c) -> {
        //do something;
    };
    public void doSomethingElse() {
        abstractMethod(param1, param2, doSomething);
    }
}

但是我会收到以下错误:

Error:(37, 40) java: incompatible types: incompatible parameter types in lambda expression: wrong number of parameters: expected 0 but found 4

很明显,我无法正确执行此操作。正确的Java 8的正确方法是什么?

编辑1:根据注释,这是一种尝试更好的解决方案的尝试:

@FunctionalInterface
public interface Fazz<T> {
    String createStuff(int id, int value, T value1, T value2);
}
public abstract class AbstractFoo {
    abstractMethod(Fazz<T> interfc) {
        interfc.createStuff(/* pass parameters? */);
    }
}
public class Foo extends AbstractFoo {
    Fazz<String> doSomething = (int id, int value, String value1, String value2) -> {
        //do something;
    };
    public void doSomethingElse() {
        abstractMethod(doSomething);
    }
}

Callable接口只有一种方法:call(),该方法零参数,因此错误。

如果您想通过lambda,则应实现FunctionalInterface,例如:

@FunctionalInterface
interface DoSomething<T> {
    T doSomething(int id, int value, FooB b, FooC c);
}

然后您将能够创建和通过这样的lambda:

DoSomething<String> doSomething = (int id, int value, FooB b, FooC c) -> {
        //do something (that returns a string)
};

此外,Callable用于在单独的线程中运行逻辑。您上面发布的代码没有这样做,这意味着您可以在不使用Callable的情况下完成完全相同的工作。

如果您 do 想要在单独的线程中运行此逻辑,则可以创建一个调用doSomethingCallable。不过,为了在单独的线程中运行它,您应该使用ExecutorService

请注意:FunctionalInterface只能具有一个抽象方法(它可以具有其他默认方法 - 因为它们不是抽象的)。

在Java中使用Lambda表达式的方式, require ,在您的方法中使用功能接口来调用,而Lambda表达式必须实现。这意味着功能接口必须采用lambda表达需要的参数数量。它只能是无效的或返回单个值。

如果您需要四个参数,则没有标准界面可以为您做到这一点(可召唤不会参数)。您可以轻松定义自己的;查看双方函数以查看如何定义四个函数。

相关内容

  • 没有找到相关文章

最新更新