如何将函数引用传递到我的方法中并使用它们?
How do I pass function references into my method and use them?
我有一个工作方法,我想使用 lambda 或函数引用使其更通用。也就是说,对于在我的方法中调用的一些方法,我想将它们指定为我的方法的参数。但是我不太明白。
假设我有以下基本 class 结构
class B {}
class C {
public Set<Integer> getIds() { ... }
public void addB(B b) { ... }
}
而且我有我的工作方法
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));
}
}
}
}
这样称呼 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));
}
}
}
}
这样称呼:p1(cs, bs, C::getIds);
- 再一次,到目前为止一切顺利。我现在将 getIds()
作为参数传递给我的函数并使用它。
现在我想为 addB()
方法提供一个 lambda 作为 p1()
的第四个参数,但我找不到正确的方法。我尝试了几件事,例如。 Function
和 Consumer<B>
,但我不知道该怎么做。有什么建议吗?
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));
}
}
}
}
然后你可以传递 lambda 表达式 (c,b)->c.addB(b)
或方法引用 C::addB
作为方法的第四个参数。
我有一个工作方法,我想使用 lambda 或函数引用使其更通用。也就是说,对于在我的方法中调用的一些方法,我想将它们指定为我的方法的参数。但是我不太明白。
假设我有以下基本 class 结构
class B {}
class C {
public Set<Integer> getIds() { ... }
public void addB(B b) { ... }
}
而且我有我的工作方法
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));
}
}
}
}
这样称呼 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));
}
}
}
}
这样称呼:p1(cs, bs, C::getIds);
- 再一次,到目前为止一切顺利。我现在将 getIds()
作为参数传递给我的函数并使用它。
现在我想为 addB()
方法提供一个 lambda 作为 p1()
的第四个参数,但我找不到正确的方法。我尝试了几件事,例如。 Function
和 Consumer<B>
,但我不知道该怎么做。有什么建议吗?
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));
}
}
}
}
然后你可以传递 lambda 表达式 (c,b)->c.addB(b)
或方法引用 C::addB
作为方法的第四个参数。