上次,我发现了Java8及以上版本函数式编程的难点,并在Collectors类中发现了一个静态方法mapping
。
我们有一个类员工像:
@AllArgsConstructor
@Builder
@Getter
public class Employee {
private String name;
private Integer age;
private Double salary;
}
假设我们有一个employee
类的POJO列表,并且我们希望接收一个所有员工姓名的列表。我们有两种方法,比如:
List<Employee> employeeList
= Arrays.asList(new Employee("Tom Jones", 45, 15000.00),
new Employee("Harry Andrews", 45, 7000.00),
new Employee("Ethan Hardy", 65, 8000.00),
new Employee("Nancy Smith", 22, 10000.00),
new Employee("Deborah Sprightly", 29, 9000.00));
//IntelliJ suggest replacing the first approach with ```map``` and ```collect```
List<String> collect =
employeeList
.stream()
.collect(
Collectors.mapping(Employee::getName, Collectors.toList()));
List<String> collect1 =
employeeList
.stream()
.map(Employee::getName)
.collect(Collectors.toList());
我知道第一种方法在stream
上使用终端操作,而第二种方法在stream
上使用中间操作,但我想知道第一种方法的性能是否比第二种方法差,反之亦然。如果您能解释第一种情况的潜在性能下降,当我们的数据源(employeeList)的大小将显著增加时,我将不胜感激。
编辑:
我创建了一个简单的两个测试用例,它们由一个简单的for循环中生成的记录提供。因此,对于小数据输入,使用stream.map
的传统“”方法与使用collectors.mapping
的方法之间的差别很小。另一方面,在大量增加数据(如3000000
)的情况下,令人惊讶的是collectors.mapping开始工作得更好。以便数据输入3000000
收集器不会空手。映射以@repeatedtest
的形式在10次迭代中持续56秒
;对于相同的数据输入,在相同的迭代中使用更易识别的方法,如stream.map
和然后collection
持续5秒长
。我知道我的临时测试并不是最好的,而且由于JVM优化,它不能说明现实情况,但是我们可以宣称,对于巨大的数据输入,收集器.mapping
可能是更理想的。总之,我觉得这个
我怀疑是否存在有意义的性能差异。您必须根据您的数据对其进行基准测试才能确定。
请注意,mapping
实际上并不打算直接用作收集器,而是用作另一个收集器中的下游收集器:
mapping()
收集器在多级约简中使用时最有用,例如在groupingBy或PartitioningBy的下游。
在Effective Java第三版中也有关于这一点的内容(在第46项中,第214页下约2/3处,以“counting
方法返回的收集器”为开头的段落)。基本上,它说不要使用mapping
这样的东西。
我编写了一个简单的脚本,它接受任意数量的参数来演示< code>$@和< code>$*之间的区别: 在我做的 CLI 上 这就是打印出来的 因为它们是相同的,这是否意味着等于?还是我遗漏了一点?
问题内容: 我正在运行以下代码,但有时在运行时会出现某种并发异常。 我对其进行了重构以解决并发问题,但这确实使我提出了一个问题。如果将for构造更改为Iterator模式,性能会有所不同吗?foreach构造和Iterator类之间的访问级别有什么区别? 问题答案: 区别主要在于语法糖,不同之处在于可以从迭代中删除项目。从技术上讲,增强的循环使您可以循环遍历所有,其中至少包括s和数组。 不必担心性
问题内容: 我正在计算稀疏自动编码器的算法。我已经使用和在python中实现了它。代码几乎相同,但是性能却大不相同。matlab完成任务所需的时间为0.252454秒,而numpy为0.973672151566,几乎是原来的四倍。在最小化问题中,我将在以后多次调用此代码,因此这种差异会导致实现之间的延迟几分钟。这是正常行为吗?如何提高numpy的性能? numpy实现: Sparse.rho是调整
是的,这是一个老话题,但我还是有些困惑。 在爪哇,人们说: LinkedList的插入速度比ArrayList快。这里插入是什么意思?如果这意味着向后移动一些元素,然后将元素放在中间的空点,那么ArrayList应该比LinkedList慢。如果插入只意味着添加(对象)操作,这怎么会慢呢?
在swift中似乎有两个相等运算符:双相等()和三相等(),这两者有什么区别?