如何将函数引用传递给我的方法并使用它们?

dav*_*ave 4 java lambda java-8 method-reference

我有一个工作方法,我想使用lambdas或函数引用更通用.也就是说,对于在我的方法中调用的一些方法,我想将它们指定为我的方法的参数.但是我无法理解它.

假设我有以下基本类结构

class B {}
class C {
    public Set<Integer> getIds() { ... }
    public void addB(B b) { ... }
}
Run Code Online (Sandbox Code Playgroud)

我有自己的工作方法

private void p1(Map<Integer, C> cs, Map<Integer, B> bs) {
    for (C c : cs.values()) {
        for (Integer id : c.getIds()) {
            if (bs.containsKey(id)) {
                c.addB(bs.get(id));
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是所谓的p1(cs, bs);- 到目前为止一切顺利.

使其更通用的第一步是为getIds()方法提供lambda .我使用以下方法实现了:

private void p1(Map<Integer, C> cs, Map<Integer, B> bs, Function<C, Set<Integer>> f) {
    for (C c : cs.values()) {
        for (Integer id : f.apply(c)) {  // Change here
            if (bs.containsKey(id)) {
                c.addB(bs.get(id));
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这样称呼: p1(cs, bs, C::getIds);- 再次,到目前为止一切顺利.我现在getIds()作为一个参数传递给我的函数并利用它.

现在我想为方法提供一个lambda addB()作为第四个参数p1(),我找不到正确的方法.我尝试过几件事,比如说.Function而且Consumer<B>,我无法弄清楚该怎么做.有什么建议?

Era*_*ran 5

A BiConsumer<C,B>应该工作:

private void p1(Map<Integer, C> cs, Map<Integer, B> bs, Function<C, Set<Integer>> f, BiConsumer<C,B> cons) {
    for (C c : cs.values()) {
        for (Integer id : f.apply(c)) {
            if (bs.containsKey(id)) {
                cons.accept(c,bs.get(id));
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以将lambda表达式(c,b)->c.addB(b)或方法引用C::addB作为方法的第四个参数传递.