我想在java中实现类似javascript的方法,这可能吗?
说,我有一个Person类:
public class Person {
private String name ;
private int age ;
// constructor ,accessors are omitted
}
Run Code Online (Sandbox Code Playgroud)
以及包含Person对象的列表:
Person p1 = new Person("Jenny",20);
Person p2 = new Person("Kate",22);
List<Person> pList = Arrays.asList(new Person[] {p1,p2});
Run Code Online (Sandbox Code Playgroud)
我想实现这样的方法:
modList(pList,new Operation (Person p) {
incrementAge(Person p) { p.setAge(p.getAge() + 1)};
});
Run Code Online (Sandbox Code Playgroud)
modList接收两个参数,一个是列表,另一个是"函数对象",它循环列表,并将此函数应用于列表中的每个元素.在函数式编程语言中,这很容易,我不知道java是怎么做到的?也许可以通过动态代理完成,与原生for循环相比,它是否有性能折衷?
Pét*_*rök 14
您可以使用接口和实现它的匿名内部类来完成它,例如
Person p1 = new Person("Jenny",20);
Person p2 = new Person("Kate",22);
List<Person> pList = Arrays.asList(p1, p2);
interface Operation {
abstract void execute(Person p);
}
public void modList(List<Person> list, Operation op) {
for (Person p : list)
op.execute(p);
}
modList(pList, new Operation {
public void execute(Person p) { p.setAge(p.getAge() + 1)};
});
Run Code Online (Sandbox Code Playgroud)
请注意,对于Java5中的varargs,Arrays.asList可以简化调用,如上所示.
更新:上述的一般版本:
interface Operation<E> {
abstract void execute(E elem);
}
public <E> void modList(List<? extends E> list, Operation<E> op) {
for (E elem : list)
op.execute(elem);
}
modList(pList, new Operation<Person>() {
public void execute(Person p) { p.setAge(p.getAge() + 1); }
});
Run Code Online (Sandbox Code Playgroud)
请注意,通过上面的定义modList,您可以执行Operation<Person>on,例如a List<Student>(提供的Student是子类Person).普通List<E>参数类型不允许这样做.
| 归档时间: |
|
| 查看次数: |
15600 次 |
| 最近记录: |