【问题标题】:Callback interface to a functional interface功能接口的回调接口
【发布时间】:2018-09-06 06:58:21
【问题描述】:

出于显而易见的原因,我正在尝试熟悉 Java 8 的功能接口。我慢慢理解了这个概念,并一直在尝试重构一些现有的代码来使用它。我确信有几种不同的方法可以实现这一点......但是无论出于何种原因,我都在苦苦挣扎 - 这真的很令人沮丧。也许在这里使用它没有意义,但我会让你成为法官......

我当前的回调实现使用了一个匿名内部类,我会(希望)用 lambda 表达式替换它。这是一个例子:

MessageReceived.java

public class MessageReceived {
    private final Map<String, Researcher> researchers = new HashMap<>();

    public void receive(String researcherName, ResearchData researchData) {
        if (!researchers.containsKey(researcherName)) {

            researchers.put(researcherName, new Researcher(new ResearchCallback() {
                @Override
                public void discoveredResearch(ResearchData researchData, Map<Object, String> discovered) {

                    // iterate discovered
                    discovered.forEach((object, stringData) -> {
                        // do something
                    });
                }
            }));
        }

        researchers.get(researcherName).research(researchData);
    }
}

ResearcherCallback.java

public interface ResearcherCallback {

    void discoveredResearch(ResearchData data, Map<Object, String> discovered);
}

Researcher.java

public class Researcher {
    private final ResearchCallback callback;

    public Researcher(ResearchCallback callback) {
        this.callback = callback;
    }

    public void research(ResearchData data) {
        // quite a bit of logic goes here that builds the list of data...
        callback.discoveredResearch(data, mapOfDiscoveredStuff);
    }
}

【问题讨论】:

  • 你的 lambda 看起来像 (event, map) -&gt; {..}。但我在receive 方法中找不到任何Event 类型的对象。还有discovered是什么?
  • 已更新。 discovered 是一个包含 research() 方法找到的对象的映射。返回到调用MessageReceived.java中的AICdiscoveredResearch的回调接口。

标签: java lambda functional-programming anonymous-inner-class


【解决方案1】:

您可以将匿名类替换为与功能接口ResearchCallback 对应的 lambda 主体。

你的接口函数的方法是:

void discoveredResearch(ResearchData data, Map<Object, String> discovered);

它接受两个参数并且什么都不返回。
所以像 (data, discovered) -&gt; {} 这样的 lambda 体适合。

它会给:

researchers.put(researcherName, new Researcher( (data, discovered) ->
        discovered.forEach((object, stringData) -> {
            // do something
        }));
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    • 1970-01-01
    • 2020-08-10
    相关资源
    最近更新 更多