我想在
java中实现一个
javascript的方法,这是可能吗?
说,我有一个Person类:
public class Person { private String name ; private int age ; // constructor,accessors are omitted }
和一个包含Person对象的列表:
Person p1 = new Person("Jenny",20); Person p2 = new Person("Kate",22); List<Person> pList = Arrays.asList(new Person[] {p1,p2});
我想实现一个这样的方法:
modList(pList,new Operation (Person p) { incrementAge(Person p) { p.setAge(p.getAge() + 1)}; });
modList接收两个参数,一个是列表,另一个是“功能对象”,它循环列表,并将该函数应用于列表中的每个元素.在功能编程语言中,这很简单,我不知道java怎么做?也许可以通过动态代理来完成,与原生for循环相比,性能是否折衷?
解决方法
你可以使用一个接口和一个实现它的匿名内部类来实现
Person p1 = new Person("Jenny",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)}; });
请注意,使用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); } });
请注意,通过modList的上述定义,您可以执行“操作”>在例如列表<学生> (提供学生是Person的子类).普通列表< E>参数类型不允许这样.