我的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>.
在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)
您可以使用接口
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)