将对象列表映射到另一个对象列表的方法

时间:2019-10-11 05:23:08

标签: java

首先,这些类是模拟数据类。 我有电话列表,我必须创建一个仅包含电话类型的新列表。为此,我有两个选择,如果有人能以适当的理由解释哪个选择比另一个选择更好。

Class Phone{
      int id;
      String type;
      Company company;
     //Assume all getters setters and constructor is there

 }
Class PhoneType{
      int id;
      String type;
     //Assume all getters setters and constructor is there
 }

并且我有如下的Phone对象列表。

List<Phone> phones = new ArrayList<>();
phones.add(new Phone(1,"J7",samsung));
phones.add(new Phone(2,"J5",samsung));
phones.add(new Phone(3,"I5",apple));

我必须从电话列表中获取电话类型列表。为此,我有以下两种方法 第一种方式

List<PhoneType> phoneTypes;
phoneTypes = phones.parallelStream().
map(phone ->new PhoneType(phone.getId(),phone.getType())).
collect(Collectors.toList());

第二种方式

List<PhoneType> phoneTypes = new ArrayList<>();
phones.parallelStream().forEach(
phone -> phoneTypes.add(new PhoneType(phone.getId(), phone.getType())));

如果您有比上述方法更好的方法,请同时参考它们

1 个答案:

答案 0 :(得分:1)

我会说,这是规范的方法。无需单独创建,可以添加进一步的操作,例如过滤器。我想那还是个口味问题。

List<PhoneType> phoneTypes = phones.stream()
  .map(p -> new PhoneType(p.getId(), p.getType())))
  .collect(Collectors.toList());

下面列出了在8核/ 8Gb机器,4Gb JVM堆大小上收集的经验测试结果的多种可能性。如果能从中获得一些收获,那就是差异不会随数量级的变化而变化,而collection.foreach可能会以某种方式领先于其他一切。找到另一个类似的讨论here,测量包括迭代器在内的其他变化并得出相似的结论。

对于不同的方法:stream.forEach()不保留输入的顺序,其他所有操作都可以保留,here's对流与集合的详细讨论。

上面提到的第一种方法由于parallelStream而无法参赛,事实证明,在进行简单的地图操作时,这种方法总是比较慢。

第二个,因为collection.forEach可以完成相同的工作,因此可以保留顺序并且也更快。在这种情况下,无需大量投入 意识形态方面,我想在讨论中暗示是否premature optimization is the root of all evil

中间版本将是collection.forEach而不是stream().forEach,但我仍然觉得它对 看一下stream()。map,似乎有一些性能上的提升,虽然并不算大,但我们不得不权衡这一点 美学上的缺点。也许是口味问题。

一个人可以选择只对for循环和数组进行操作,从而完全避开了集合和流。缺点是, 它们只有固定长度,与光滑的功能版本相比显得凌乱。

我进行了一系列测试,找到下面的结果,令人惊讶的是collection.foreach领先于此,接着是 循环版本和流版本最后,而parallelStream运行最慢。测试结果受因素影响 我无法精确确定,垃圾收集是主要的嫌疑犯。

您可以找到code and data并根据这些要点得出这些结果。

我进行了10次运行,每个运行映射中的列表/数组大小分别为100000、1000000、10000000、20000000和30000000。

在每次运行之前进行的预热运行为30000000,未进行测量。 仍然到处散布着异常值(平均17秒,平均1.5秒),我将其归咎于垃圾收集器。 为了对平均值进行最终计算,我将异常值替换为列的平均值(包括异常值)

loop:array→array    1.8
loop:array→list     0.983
collection.foreach  0.8
stream.foreach      1.3
mapSeq              1.8
mapParallel         2.1