如何在java中将成员函数作为参数传递?

时间:2013-03-05 16:18:09

标签: java

我的collect()函数调用Foo.f()。我想让Foo.f()本身成为我职能的一个参数。这在Java中可行吗?

  • 如何将Foo.f()Foo.g()(或Foo的任何其他函数返回String)传递给我的函数?
  • 是否存在已经存在的函数,该函数遍历集合并收集调用每个集合项的方法的结果?

class Foo {
    public String f() { return "f"; }
    public String g() { return "g"; }
    // ...
}

public List<String> collect(List<Foo> foos)
{
    List<String> result = new ArrayList<String>();

    for (final Foo foo: foos) {
        result.add(foo.f());  // I want Foo.f to be a parameter
    }

    return result;
}

更新

我想指出的事实是,我不仅仅为f集合的所有项目调用相同的函数,而是成员函数List<Foo>

4 个答案:

答案 0 :(得分:7)

在Java 8中,你可以做到

collect(foos, Foo::f);

public List<String> collect(List<Foo> foos, Function<Foo,String> func)
{
    List<String> result = new ArrayList<String>();

    for (final Foo foo: foos) {
        result.add(func.apply(foo));
    }

    return result;
}

或使用steam API

Stream<Foo> foos = ...;
Stream<String> strs = foos.map(Foo::f);

答案 1 :(得分:6)

您可以使用接口

  interface Foo
  {
      String fn();
  }

并将接口传递给方法

 void anyMethod(Foo f)
 {
   f.fn();
 }

您不需要创建具体的Foo,只需匿名创建Foo

  new Foo() {

  @Override
  public String fn()
  {
   return "something";
  }
};

在Java 8中,您无需匿名实现该接口。你可以使用lambda表达式。

  anyMethod(()-> "something");

答案 2 :(得分:0)

在Java中,您不应该将方法作为参数传递,但可以将对象作为参数传递。

它被称为Strategy Pattern,你需要使用接口。

答案 3 :(得分:0)

您可以使用如下界面:

interface IFoo {
    String getString();
}

然后以自定义方式实现它:

class F implements IFoo {
    public String getString() {
        return "f";
    }
}

class G implements IFoo {
    public String getString() {
        return "g";
    }
}

让你的函数列出任何实现IFoo的内容:

public List<String> collect(List<? extends IFoo> foos)
{
    List<String> result = new ArrayList<String>();

    for (final IFoo foo: foos) {
        result.add(foo.getString());
    }

    return result;
}

用法:

for (String a : collect(Arrays.asList(new F(), new G()))) {
    System.out.println(a);
}
    //Prints f and g