使用函数接口抽象公共代码的问题

这里我实现了以下两个函数,如下所示:

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和releaseLockfunction:

 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中的相关post,但是无法理解。

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

 public interface Identifiable{ String getId(); } public static  R executeWithLock(T input, Function 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;});