有一个类似于Callable的接口,但有参数吗?

Java中是否有类似于Callable接口的接口,它可以接受其调用方法的参数?

像这样:

 public interface MyCallable<V> { V call(String s) throws Exception; } 

我宁愿避免创build一个新的types,如果已经存在的东西,我可以使用。 还是有更好的策略让多个客户端实现并插入一个可调用的例程?

从这里复制http://www.programmingforums.org/thread27905.html

由于Java 8在java.util.functionjava.util.function一整套类似于函数的接口。 你特别要求的只是Function

在Java 8之前,没有通用的内置接口,但是一些库提供了它。

例如, 番石榴具有与方法T apply(F input)Function<F,T>接口 。 它也在很多地方大量使用该接口 。

起初它认为这是通过一个接口完成的,但是我发现它应该使用一个抽象类来完成。

我已经这样解决了:


编辑:最近我只是使用这个:

  public static abstract class callback1<T>{ public abstract void run(T value); } public static abstract class callback2<T,J>{ public abstract void run(T value,J value2); } public static abstract class callback3<T,J,Z>{ public abstract void run(T value,J value2,Z value3); } public static abstract class callbackret1<R,T>{ public abstract R run(T value); } public static abstract class callbackret2<R,T,J>{ public abstract R run(T value,J value2); } public static abstract class callbackret3<R,T,J,Z>{ public abstract R run(T value,J value2,Z value3); } 

CallBack.java

 public abstract class CallBack<TRet,TArg> { public abstract TRet call(TArg val); } 

定义方法:

 class Sample2 { CallBack<Void,String> cb; void callcb(CallBack<Void,String> CB) { cb=CB; //save the callback cb.call("yes!"); // call the callback } } 

使用方法:

 sample2.callcb(new CallBack<Void,String>(){ @Override public Void call(String val) { // TODO Auto-generated method stub return null; } }); 

两个参数示例: CallBack2.java

 public abstract class CallBack2<TRet,TArg1,TArg2> { public abstract TRet call(TArg1 val1,TArg2 val2); } 

注意当你使用Void返回types时,你必须使用return null; 所以这里是一个修正,因为通常callback没有返回任何价值。

无效作为返回types: SimpleCallBack.java

 public abstract class SimpleCallBack<TArg> { public abstract void call(TArg val); } 

无效作为返回types2参数: SimpleCallBack2.java

 public abstract class SimpleCallBack<TArg1,TArg2> { public abstract void call(TArg1 val1,TArg2 val2); } 

接口对此没有用处。

接口允许多种types匹配相同的types。 通过具有共享的预定义的一组function。

抽象类允许内部的空函数稍后完成。 在扩展或实例化。

我最近有同样的要求。 正如其他人所解释的,许多库提供了“function”方法,但是这些方法不会抛出exception。

一些项目提供了一个解决scheme的例子RxJava库,他们在这里使用了ActionX这样的接口,其中'X'是0 … N,是调用方法的参数个数。 他们甚至有一个可变参数界面, ActionN

我目前的做法是使用一个简单的通用接口:

 public interface Invoke<T,V> { public T call(V data) throws Exception; // public T call(V... data) throws Exception; } 

第二种方法对我来说比较好,但是在我的IDE中,它展现出令人畏惧的“types安全:通过可变参数数据的潜在堆污染”,这是另外一个问题。

我正在看的另一种方法是使用现有的接口,如java.util.concurrent.Callable ,不抛出exception,并在我的实现包装未经检查的exceptionexception。

答案是不明确的。 严格地说,就是“为了Callable接口的相同目的”,没有。

有类似的类,根据你想要什么,他们可能会也可能不方便。 其中之一是SwingWorker 。 然而,顾名思义,它是为在Swing框架中使用而devise的。 它可以用于其他目的,但这将是一个糟糕的deviseselect。

我最好的build议是使用扩展库(Jakarta-Commons,Guava等)提供的库,这取决于你已经在系统中使用了哪些库。

通常参数不是必需的,因为该方法在其构造函数中可以有任意数量的参数。

 final int i = 5; final String word = "hello"; Future<String> future = service.submit(new Callable<String>() { public String call() { return word + i; } }); 

在这个例子中, iword已经被使用,但是你可以“传递”任何数量的参数。

我只是有同样的问题。 你可以包装任何方法来返回一个可调用,并执行它的返回值。 即

  main { Callable<Integer> integerCallable = getIntegerCallable(400); Future<Integer> future = executor.submit(integerCallable); } private Callable<Integer> getIntegerCallable(int n) { return () -> { try { TimeUnit.SECONDS.sleep(n); return 123; } catch (InterruptedException e) { throw new IllegalStateException("task interrupted", e); } }; }