出于明显的原因,我试图熟悉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);
}
}发布于 2018-03-27 18:45:30
您可以用对应于函数接口ResearchCallback的lambda主体替换您的匿名类。
接口功能的方法是:
void discoveredResearch(ResearchData data, Map<Object, String> discovered);它接受两个对角,却什么也不返回。
所以像(data, discovered) -> {}这样的羔羊身体适合。
它将提供:
researchers.put(researcherName, new Researcher( (data, discovered) ->
discovered.forEach((object, stringData) -> {
// do something
}));
);https://stackoverflow.com/questions/49520136
复制相似问题