加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java中的函数对象

发布时间:2020-12-14 16:47:11 所属栏目:Java 来源:网络整理
导读:我想在 java中实现一个 javascript的方法,这是可能吗? 说,我有一个Person类: public class Person { private String name ; private int age ; // constructor,accessors are omitted} 和一个包含Person对象的列表: Person p1 = new Person("Jenny",20);P
我想在 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>参数类型不允许这样.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读