如何像在C#中那样在Java中使用回调调用函数?

如何像在C#中那样在Java中使用回调调用函数?,c#,java,android,delegates,C#,Java,Android,Delegates,我对Java非常陌生,但我需要编写类似于此C#代码的代码(这是手动键入的原型,只是为了说明我需要什么) private void ParentFunc() { var worker=new worker类() worker.DoWork(e=>console.Write(“Progress”+e)); } 公共类WorkerClass() { 公共方法DoWork(操作回调) { 对于(int i=1;i,借助支持类: interface CallBack<P> { public

我对Java非常陌生,但我需要编写类似于此C#代码的代码(这是手动键入的原型,只是为了说明我需要什么)

private void ParentFunc()
{
var worker=new worker类()
worker.DoWork(e=>console.Write(“Progress”+e));
}
公共类WorkerClass()
{
公共方法DoWork(操作回调)
{

对于(int i=1;i,借助支持类:

interface CallBack<P>
{
  public void callback(P p);
}

class MyCallBack implements CallBack<String> {
  public void callBack(String p) {
    System.out.println(p);
  }
}

class WorkerClass {
  public void doWork(CallBack<String> callback)
  {
    // do work
    callback.callBack("Done!");
  }
}

WorkerClass wc = new WorkerClass();
wc.doWork(new MyCallBack());
接口回调

{ 公共无效回收(P); } 类MyCallBack实现回调{ 公共无效回调(字符串p){ 系统输出println(p); } } 阶级工人阶级{ 公共无效doWork(回调) { //工作 回调。回调(“完成!”); } } WorkerClass wc=新的WorkerClass(); wc.doWork(新的MyCallBack());


我不会建议您使用匿名类,因为我发现它们非常冗长,直到无法使用更流畅的语法为止,但这只是个人喜好的问题,当我使用它们时,我最终会在大括号之间失去自我。

在java中,您使用匿名类实现接口。这有点冗长,但只适用于东北:

interface MyAction {
    void doit(String str);
}

class WorkerClass {
    void doWork(MyAction action);
}

void main(String args[]) {
    WorkerClass worker = new WorkerClass();
    worker.doWork(new MyAction {
        public void doit(String e) {
            System.out.println("Progress" + e)
        }
    });
}

由于闭包还不受支持,所以您必须使用接口和匿名内部类

private void ParentFunc {
    WorkerClass worker = new WorkerClass();

    worker.doWork(new Callback<Integer>() {
        public void invoke(Integer arg) {
            System.out.println("Progress" + arg);
        }
    });
}

public class WorkerClass {
    public doWork(Callback<Integer> callback) {
        for (int i=1; i<1000; i++) callback.invoke(i);  
    }
}

public interface Callback<T> {
    public void invoke(T arg);
}
private void ParentFunc{
WorkerClass worker=新的WorkerClass();
worker.doWork(新回调(){
公共void调用(整型参数){
系统输出打印项次(“进度”+arg);
}
});
}
公营工人班{
公共道具(回调){

对于(int i=1;i而言,java 8是可能的。请参阅我对重复问题的回答:

使用函数作为参数:

import java.util.function.Function;

public String applyFunction(Function<String,String> function){
        return function.apply("what ever");
}

可能是@Eng.Fouad Oops的重复,我用C#编码太久了:)谢谢!
import java.util.function.Function;

public String applyFunction(Function<String,String> function){
        return function.apply("what ever");
}
// with someObject.someMethod(String) => String
xxx.applyFunction(someObject::someMethod);