gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 23:19:06 25 4
gpt4 key购买 nike

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

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
}

我有一个电话对象列表,如下所示。

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

如果您还有比上述方法更好的方法,也请引用

最佳答案

我想说,这是规范的方法。不需要创建单独的操作,可以添加过滤器等进一步的操作。我想这仍然是一个品味问题。

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 的原因而被取消资格,事实证明,在简单的 map 操作情况下,它始终较慢。

第二个,因为 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.8loop:array→list     0.983collection.foreach  0.8stream.foreach      1.3mapSeq              1.8mapParallel         2.1

关于java - 将对象列表映射到另一个对象列表的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58334705/

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