java - 使用函数接口(interface)抽象公共(public)代码的问题

标签 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中关于如何将函数作为参数传递的相关帖子,但不太理解。

最佳答案

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;});

关于java - 使用函数接口(interface)抽象公共(public)代码的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51157631/

相关文章:

java - 自动排序依赖关系

java - 如何在 bundle 中传递 list<>

java-8 - 如何从 Instant 转换为 LocalDate

string - java 8 String.chars() 是否可以正确处理 8 字节字符?

java - 是否可以使用 Java 8 将日期截断为月份?

java - 按顺序打印列表中的字符串元素

java - 查找 Swing 计时器已经运行了多长时间

hibernate - 使用JPA2/Hibernate持久化java.time.Instant(JDK8)

java - 如何在 Embedded JDK compact 中使用 log4j 1/2/3

Java Memcached 不跨实例复制条目