使用功能接口抽象通用代码的问题

时间:2018-07-03 14:56:58

标签: java java-8

在这里,我实现了以下两个功能,如下所示:

  Output1 computeFirst(Input1 input) {
        String lockName = input.getId();
        LockItem lockItem = acquireLock(lockName);

        try{

        #critical section

        }catch(Exception e){
              log.error(e);
        }finally{
          releaseLock(lockItem);
        }
  }




  Output2 computeSecond(Input2 input) {
        String lockName = input.getId();
        LockItem lockItem = acquireLock(lockName);

        try{

        #critical section

        }catch(Exception e){
              log.error(e);
        }finally{
          releaseLock(lockItem);
        }
    }

以上两个函数的调用流程不同。

从上面的两个函数中,我想通过编写如下另一个函数来抽象出acquireLock和releaseLock功能:

executeWithLock(String lockName, funcionReference) {
   String lockName = input.getId();
   LockItem lockItem = acquireLock(lockName);
   try{
        func.apply
   } catch(Exception e){
        log.error(e);
   } finally {
         releaseLock(lockItem);

   }
}

我无法弄清楚如何实现executeWithLock函数,在这种情况下,我已经在stackoverflow中浏览了有关如何将函数作为参数传递的相关文章,但了解得不多。

1 个答案:

答案 0 :(得分:0)

Runnable也不起作用,因为还有输出。

public interface Identifiable{
    String getId();
}

public static <T extends Identifiable,R> R executeWithLock(T input, Function<T,R> func) {
    String lockName = input.getId();
    LockItem lockItem = acquireLock(lockName);
    try{
        return func.apply(input);
    } catch(Exception e){
        log.error(e);
        return null;
    } finally {
        releaseLock(lockItem);
    }
}

打来电话

Output1 output = executeWithLock(input1, 
    (input) -> {return /*compute output as in critical section*/ null;});