java - 函数接口(interface)的回调接口(interface)

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

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

我当前的回调实现使用匿名内部类,我(希望)将其替换为 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);
    }
}

最佳答案

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

您的接口(interface)功能的方法是:

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

它接受两个参数并且不返回任何内容。
因此,诸如 (data, discovery) -> {} 之类的 lambda 主体就适合。

它会给出:

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

关于java - 函数接口(interface)的回调接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49520136/

相关文章:

java - 方法 : com. foo.D.doSomething() 的签名不适用于参数类型 : (com. foo.C)

java - 从功能上遍历图像的惯用方式

Java 图像调整大小代码不起作用

java - HashTable中的排序问题

r - 将数据框通过管道传递给一个函数,该函数的参数通过管道传递一个点

c++ - 如何将可变数量的参数传递给 lambda 函数

java - 如何使用 LambdaMetaFactory 调用构造函数?

javascript - Promises 相对于 CPS 和 Continuation Functor/Monad 有哪些优势?

functional-programming - APL - 如何找到字符串向量中最长的单词?

java - 如何从docker容器中的InetAddress.getLocalHost().getHostName()返回 "localhost"