回调接口到功能接口



我试图出于明显的原因而试图熟悉Java 8的功能接口。我慢慢地理解了这个概念,并一直试图重构一些现有的代码以使用它。我敢肯定,有几种不同的方法来实施此问题……但是出于原因,我正在挣扎 - 这确实令人沮丧。也许在这里使用它没有意义,但我会让您成为法官...

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

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

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

接口功能的方法是:

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

它接受两个参数并没有返回。
因此,诸如(data, discovered) -> {}西装等lambda主体。

它将给出:

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

最新更新