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

Mic*_*ann 1 java

我的collect()函数调用Foo.f().我想让Foo.f()自己成为我的功能参数.这在Java中可行吗?

  • 我如何将其中任何一个Foo.f()Foo.g()(或任何其他函数Foo返回a 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;
}
Run Code Online (Sandbox Code Playgroud)

更新

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

irr*_*ble 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;
}
Run Code Online (Sandbox Code Playgroud)

或者使用蒸汽API

Stream<Foo> foos = ...;
Stream<String> strs = foos.map(Foo::f);
Run Code Online (Sandbox Code Playgroud)


Sle*_*idi 6

您可以使用接口

  interface Foo
  {
      String fn();
  }
Run Code Online (Sandbox Code Playgroud)

并将接口传递给方法

 void anyMethod(Foo f)
 {
   f.fn();
 }
Run Code Online (Sandbox Code Playgroud)

你不需要创建一个具体的Foo,只需Foo匿名创建

  new Foo() {

  @Override
  public String fn()
  {
   return "something";
  }
};
Run Code Online (Sandbox Code Playgroud)

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

  anyMethod(()-> "something");
Run Code Online (Sandbox Code Playgroud)