【问题标题】:JAVA iterate and Copy objects from one List to one other List [closed]JAVA迭代并将对象从一个列表复制到另一个列表[关闭]
【发布时间】:2015-02-12 17:01:09
【问题描述】:

在 Java 中,这是将对象 UserAndSum 从一个列表复制到另一个列表的最佳方式。

编辑: 我有一个包含许多用户的 OBJ 用户列表,我想要一个只包含前 25 个用户的新用户

List <UserAndSum> list= new ArrayList<UserAndSum>();
list.add(new UserAndSum(john, 55));
list.add(new UserAndSum(tom, 88));
list.add(new UserAndSum(brian, 99));
....

List <UserAndSum> list25 = new ArrayList<UserAndSum>();
???? ADD ONLY 25 UserAndSum????

【问题讨论】:

  • 您要复制对象或对象引用?
  • 我想将 obj UserAndSum 从一个列表复制到另一个列表,这样我就可以拥有只有前 25 个用户的相同列表
  • 改变一个列表中对象的状态是否也会影响其从其他列表中的副本?例如,如果您将UserAndSum(john, 55)list 复制到list25,并且您将在list 中将年龄设置为56,那么此更改是否应该在list25 中也可见?
  • 对不起,我试图解释得很好...我有一个包含许多用户的 OBJ 用户列表,我想要一个只包含前 25 个用户的新用户
  • 我们可以深度克隆stackoverflow.com/questions/715650/…吗?

标签: java list add


【解决方案1】:

如果你想在list 的前25 个元素中放置list25 (而不实际创建UserAndSum 的副本),那么你可以简单地写

List <UserAndSum> list25 = list.subList(0, Math.min(25, list.size()));

我添加了Math.min(25, list.size()),以防列表中的元素少于 25 个。


您可以使用 Java 8 及其stream() 创建更清晰的代码。

List <UserAndSum> list25 = list.stream().limit(25).collect(Collectors.toList());

两种解决方案都将产生相同的结果,但 limit(25) IMO 描述比 Math.min(25, list.size()) 更容易实现。

【讨论】:

  • 深度克隆在这里有意义吗?
  • @KickButtowski 这取决于 OP 真正想要实现的目标。我的回答是基于我们不需要它的假设,正如我在帖子开头试图解释的那样。
  • 就我个人而言,我发现“sublist”比“stream().limit().collect()”更清楚地表示方法调用(无论是在语法还是语义上),但这就是时间所在不幸的是。就我个人而言,我也很难看出新语法有什么性能提升......这不是真正表达这些问题的地方;你的代码很好,但是 grrrr 映射函数。
  • @gnomed "我很难看出新语法对性能有何提升" 在这种情况下不会有真正的性能提升。我怀疑我们会在使用parallelStream() 时开始看到它,它将能够将任务拆分为更小的任务(可能使用合并排序可能是一个很好的例子)并同时执行它们。但是是的,虽然limit(25) 可能更有意义,但collect 可能会增加更多混乱,因此这种方法可能更容易阅读,可能只有习惯了它的人才能阅读。
猜你喜欢
  • 1970-01-01
  • 2015-11-28
  • 1970-01-01
  • 1970-01-01
  • 2013-02-02
  • 1970-01-01
  • 2012-07-21
  • 2016-11-08
  • 1970-01-01
相关资源
最近更新 更多