当前位置: 首页 > 知识库问答 >
问题:

Stream.Map与Collectors.Mapping[duplicate]之间的性能差异

夏锐藻
2023-03-14

上次,我发现了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可能是更理想的。总之,我觉得这个

共有1个答案

扈翰
2023-03-14

我怀疑是否存在有意义的性能差异。您必须根据您的数据对其进行基准测试才能确定。

请注意,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中似乎有两个相等运算符:双相等()和三相等(),这两者有什么区别?