gpt4 book ai didi

java - Java 中的函数对象

转载 作者:搜寻专家 更新时间:2023-10-30 21:45:41 26 4
gpt4 key购买 nike

我想在 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 循环相比,这是否有性能折衷?

最佳答案

你可以用一个接口(interface)和一个实现它的匿名内部类来做到这一点,比如

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)};
});

请注意,在 Java5 中使用可变参数时,对 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 , 你可以执行 Operation<Person>例如一个List<Student>也是(前提是 StudentPerson 的子类)。一个普通的List<E>参数类型不允许这样做。

关于java - Java 中的函数对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2599698/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com