gpt4 book ai didi

java - 如何在java中编写接受两个对象的任意列表并返回列表的泛型方法?

转载 作者:行者123 更新时间:2023-12-01 21:18:37 25 4
gpt4 key购买 nike

我有一个域类(DB):

public class PersonDoamin {
private String name;
private String age;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getAge() {
return age;
}

public void setAge(String age) {
this.age = age;
}
}

我也有模型类:

public class PersonBean extends PersonDoamin {

}

因此,当我转到 DAOImpl 类并查询 List 并将该列表传输到 List 并返回给用户时,因为我有 List getAllPerson() 的接口(interface)方法。所以当我从列表中传输所有数据时,我的问题就在这里。这里我有一些实用方法可以从一个 bean 复制到另一个 bean,如下所示:

List<PersonDoamin> list = PersonDAO.getAllPersons();
List<PersonBean> pbList = new ArrayList<PersonBean>();

/* this below logic is pretty much in the all DAO impl*/

for(PersonDoamin p : list){
PersonBean pb = new PersonBean();
CopyHelper.copyBean(p, pb);
pbList.add(pb);
}
return pbList;

我们可以用某种通用方法来替换循环、复制和添加到另一个列表并返回部分,该方法将获取两个列表中的任何对象并循环遍历一个列表,并将其添加到另一个传递的列表参数中并返回它。如下所示,目前尚不完美:

public static <T> List<T> listToArray(List<T> list,List<T> list2) {

for(T element : list){
list2.add(element);
}
return list2;
}

public static void main(String[] args) {
List<PersonDoamin> personList = new ArrayList<PersonDoamin>();
PersonDoamin p = new PersonDoamin();
p.setName("aj");
p.setAge("25");
personList.add(p);
List<PersonBean> personBeansToReturn = new ArrayList<PersonBean>();
Test.listToArray(personList , personBeansToReturn );

}

最佳答案

有点偏离主题,你的设计看起来有点奇怪,你有“Domain”类和“Bean”类,并且“Bean”扩展了“Domain”...

无论如何,回到你的问题,你想做的是:

  1. 您有 List<Domain>
  2. 您想要将列表中的每个域转换为 Bean(通过使用某些 util 方法)
  3. 将生成的 Bean 放入列表中并返回

让我们一步一步来。

(顺便说一句,您编写的 listToArray 方法与原始循环不一致,因为它没有进行转换(第 2 点)。我猜这是拼写错误?)

(所有伪代码,因为我手头没有环境来编译它。我猜概念应该是正确的)

<小时/>

第 1 步:Person 的 Util 方法

原始 util 方法的一个最大问题是,将 Parent 对象实例放入 Child 列表中是非法的(您自己应该很容易弄清楚原因)。

util 方法应如下所示:

List<PersonBean> toBeans(List<PersonDomain> domains) {
List<PersonBean> beans = new ArrayList<>(domains.size());
for (PersonDomain domain: domains) {
PersonBean bean = new PersonBean();
CopyHelper.copyBean(domain, bean);
beans.add(bean);
}
return beans;
}
<小时/>

第 2 步:使其通用

上面的问题是它只适用于 Person 。如果要通用,还需要提供Domain转Bean的函数:

(假设您使用的是Java8,如果您使用的是旧版本,那么制作自己的界面应该很简单)

<D,B> List<B> toBeans(List<D> domains, Function<B,D> mapper) {
List<PersonBean> beans = new ArrayList<>(domains.size());
for (PersonDomain domain: domains) {
beans.add(mapper.apply(domain));
}
return beans;
}

以便您可以通过以下方式使用它:

return toBeans(personDomains, (domain) -> {
PersonBean bean = new PersonBean();
CopyHelper.copyBean(domain, bean);
return bean;
});

(如果在大多数情况下您要使用 CopyHelper 方式,您可以考虑包装该函数)

<D,B> List<B> toBeansByBeanCopy(List<D> domains, Class<B> beanClass) {
return toBeans(domains, (domain)-> {
B bean = beanClass.newInstance();
CopyHelper.copyBean(domain, bean);
return bean;
});
}

以便您可以将其用作

return toBeansByBeanCopy(personDomains, PersonBean.class);
<小时/>

第 3 步:Java 已为您完成

实际上你上面想要做的事情,它已经由 Java 8 中的 Java 提供了。你可以简单地做:

return personDomains.stream()
.map(d -> {
PersonBean bean = new PersonBean();
CopyHelper.copyBean(domain, bean);
return bean;
})
.collect(Collectors.toList());

如果是标准方式,您可以编写一个小方法在 lambda 表达式中使用。

return personDomains.stream()
.map(BeanMapper.mapper(PersonBean.class))
.collect(Collectors.toList());

(将实现作为练习)

关于java - 如何在java中编写接受两个对象的任意列表并返回列表的泛型方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39502193/

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