Java 8:将对象的方法及其参数作为参数传递

Moh*_*itt 2 java lambda design-patterns java-8

我有两个类AB,就像这样:

class A {
    public Integer fetchMax() {
       // Make a network call & return result
    } 
}

class B {
    public Double fetchPercentile(Integer input) {
        // Make a network call & return result
    } 
}
Run Code Online (Sandbox Code Playgroud)

现在,我需要提供retry这两种方法的机理fetchMax()fetchPercentile(Integer).我想使用一个helper类来提供这种行为,其中retry可以采用instance(A或B)的方法,method-namemethod-arguments.重试基本上会对提供的对象方法进行重新尝试.

像这样的东西:

class Retry {
     public static R retry(T obj, Function<T, R> method,  Object... arguments) {
           // Retry logic
           while(/* retry condition */)
           {
                obj.method(arguments);
           }
     }
}
Run Code Online (Sandbox Code Playgroud)

JB *_*zet 8

只需要一个Callable参数:

public static <R> R retry(Callable<R> action) {
    // Retry logic
    while(/* retry condition */) {
        action.call();
    }
}
Run Code Online (Sandbox Code Playgroud)

并这样称呼它:

Retry.retry(() -> a.fetchMax());
Retry.retry(() -> b.fetchPercentile(200));
Run Code Online (Sandbox Code Playgroud)

你可能想要使用guava-retrying来获取灵感,这是Google的Guava库的一个小扩展,允许创建可配置的重试策略(免责声明:我是原作者).

  • 是的,这也是你在java 8之前的做法.它应该仍然有效.lambda表达式也可以与接口一起使用,/sf/ask/952329241/参数中的Java-8 (2认同)