我有这两种方法

private void saveBaseLineLatency(E2EResultShort e2EResultShort) {
    LatencyHistogram latencyHistogram = getLatencyHistogram(e2EResultShort);
    latencyDrillDownRepository.saveBaseLine(latencyHistogram);
    saveLatencyTable(latencyHistogram);
}

private void saveFreshTestLatency(E2EResultShort e2EResultShort) {
    System.out.println("log: before saveLatencyHistogram");
    LatencyHistogram latencyHistogram = getLatencyHistogram(e2EResultShort);
    latencyDrillDownRepository.save(latencyHistogram);
    saveLatencyTable(latencyHistogram);
}

如何重构他们的通用代码?

我以为可以使用Callable,但其call()是无参数的。

#1楼 票数:0

Consumer是您想要的界面。 它是Java 8中新的java.util.function包的一部分,因此,如果您使用的是Java的旧版本,则此功能将无效。 (该软件包还具有许多类似的其他接口,例如带有两个参数的BiConsumer以及用于使用各种基本类型的接口。)

因此,您的辅助方法将类似于:

private void doLatencyOperation (E2EResultShort newThing, Consumer<LatencyHistogram> consumer) {
  LatencyHistogram lh = getLatencyHistogram(newThing);
  consumer.accept(lh);
  saveLatencyTable(lh);
}

你可以这样称呼它

private void saveBaseLineLatency(E2EResultShort e2EResultShort) {
  doLatencyOperation(e2EResultShort, (lh) -> latencyDrillDownRepository.saveBaseLine(lh));
}

#2楼 票数:0

创建一个抽象类,然后将所有通用代码移到那里。

public abstract class MyClass{

public MyClass(E2EResultShort result, latencyDrillDownRepository){
    this.result = result;
}

public void execute() {

 LatencyHistogram latencyHistogram = getLatencyHistogram(e2EResultShort);
callMe(latencyHistogram, latencyDrillDownRepository);
saveLatencyTable(latencyHistogram);

}

public abstract void callMe(LatencyHistogram latencyHistogram, latencyDrillDownRepository); }`

现在,在您的方法中,创建具体的MyClass:

private void saveFreshTestLatency(E2EResultShort e2EResultShort) {

System.out.println("log: before saveLatencyHistogram");
MyClass myClass = new MyClass(e2EResultShort, latencyDrillDownRepository){
    public void callMe(LatencyHistogram latencyHistogram, latencyDrillDownRepository){
        latencyDrillDownRepository.save(latencyHistogram);
    }
}

myClass.execute();

}

  ask by Elad Benda2 translate from so

未解决问题?本站智能推荐:

1回复

如何使用Java可调用接口异步处理队列项目?

我以前实现了Runnable接口,以从队列中peek()一个项目并将其发送到API。 但是现在我需要使用Callable接口来peek()队列,并将项目发送到API。 如果返回200,则从队列中删除该项目。 这是我用来实现此功能的代码。 如何修改代码? 有任何例子或参考吗? 谢谢
5回复

我们如何将可调用对象转换为可运行对象

我有一个实现可调用接口的类。 我想使用 ScheduledExecutorService 接口的 scheduleAtFixedRate 方法为类安排任务。 然而 scheduleAtFixedRate 需要一个可运行的对象作为它可以调度的命令。 因此,我需要某种方式将可调用对象转换为可运行对象。
2回复

如何等待多个可调用对象而不阻塞get()

我正在使用java Callable和ExecutorService执行计算: 我想让任务最多运行2分钟。 但是如果我打电话: 它将立即被阻止! 并且不要让我为其他任务分配超时,直到超时结束。 我可以用 但它返回期货列表,我不知道哪个任务属于哪个期货。
1回复

如何从可运行的可调用对象中获取类名

所以我有这段代码 我想做的是我想在参数中获取类的名称( 请参见此处的图片 )。 我的目标是获取已被拒绝的类名并报告以进行监视。 我对如何获得名称一无所知。 这是春季项目
5回复

在哪里使用可调用以及在哪里使用Runnable接口?

我是Java的新手,我正在阅读多线程的概念,在进行多线程的各种实现时,我经历了这两个概念。 这在Java问题中Runnable和Callable接口之间的区别指出了两者之间的区别以及使用的位置。 我怀疑Callable是否能够完成Runnable的所有功能,为什么这么多人使用Runnabl
3回复

可调用执行顺序吗?

每当我运行我的程序实现可调用时,我得到顺序形式的输出。 比如,这是我的程序: 可输出的输出: 输出始终按顺序打印数组,而当我实现可运行输出时,任何顺序: RUNNABLE OUTPUT: Why such a difference ?
1回复

如何在Java中的循环中使用多线程

这就是我想要做的。 我正在一段while loop记录来自不同传感器的数据,直到用户停止记录为止。 我想每秒记录尽可能多的数据。 传感器需要不同的时间来返回值,介于200ms和3秒之间。 因此,不能连续调用传感器。 依次调用传感器如下所示: 根据传感器的不同,读取数据看起来(非常
3回复

可调用线程与可运行线程与扩展线程

我最近通过implementing Runnable或Extending thread以及上一次Implementing Callable阅读有关在java中创建Threads的内容。 stackoverflow中的Runnable与可调用线程描述了引用的差异both are designed