我的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>
。
答案 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