Java8-转为流为基本数据类型求最大值、最小值、平均值、求和、计数

基本数据类型在高阶函数中的运用

众所周知,在Java中使用基本数据类型的性能和产效率远高于包装类型。由于装箱类型是对象,因此在内存中存在额外开销。比如,整型在内存中占用4 字节,整型对象却要占用 16 字节。这一情况在数组上更加严重,整型数组中的每个元素只占用基本类型的内存,而整型对象数组中,每个元素都是内存中的一个指针,指向 Java堆中的某个对象。在最坏的情况下,同样大小的数组, Integer[] 要比 int[] 多占用 6 倍内存。

将基本类型转换为装箱类型,称为装箱,反之则称为拆箱,两者都需要额外的计算开销。对于需要大量数值运算的算法来说,装箱和拆箱的计算开销,以及装箱类型占用的额外内存,会明显减缓程序的运行速度。

为了减小这些性能开销, Stream 类的某些方法对基本类型和装箱类型做了区分。Stream中的高阶函数 mapToLong 和其他类似函数即为该方面的一个尝试。在 Java 8 中,仅对整型、长整型和双浮点型做了特殊处理,因为它们在数值计算中用得最多,特殊处理后的系统性能提升效果最明显。

计算最大值、最小值、平均值、求和、计数统计

使用 mapToInt、mapToLong、mapToDouble 等高阶函数后,得到一个基于基本数据类型的流。针对这样的流,Java提供了一个摘要统计的功能(对应的类有:IntSummaryStatistics、LongSummaryStatistics 和 DoubleSummaryStatistics),如下代码所示:

/**
 * 运行入口
 *
 * @param args 运行参数
 */
public static void main(String[] args) {
    toInt();
    toLong();
    toDouble();
}

private static void toInt() {
    IntSummaryStatistics statistics = Stream.of(1L, 2L, 3L, 4L).mapToInt(Long::intValue).summaryStatistics();
    System.out.println("最大值:" + statistics.getMax());
    System.out.println("最小值:" + statistics.getMin());
    System.out.println("平均值:" + statistics.getAverage());
    System.out.println("求和:" + statistics.getSum());
    System.out.println("计数:" + statistics.getCount());
}

private static void toLong() {
    LongSummaryStatistics statistics = Stream.of(1L, 2L, 3L, 4000000000000000000L).mapToLong(Long::longValue).summaryStatistics();
    System.out.println("最大值:" + statistics.getMax());
    System.out.println("最小值:" + statistics.getMin());
    System.out.println("平均值:" + statistics.getAverage());
    System.out.println("求和:" + statistics.getSum());
    System.out.println("计数:" + statistics.getCount());
}

private static void toDouble() {
    DoubleSummaryStatistics statistics = Stream.of(1, 2, 3.0, 5.2).mapToDouble(Number::doubleValue).summaryStatistics();
    System.out.println("最大值:" + statistics.getMax());
    System.out.println("最小值:" + statistics.getMin());
    System.out.println("平均值:" + statistics.getAverage());
    System.out.println("求和:" + statistics.getSum());
    System.out.println("计数:" + statistics.getCount());
}

本文首发于个人独立博客,文章链接:http://www.zebe.me/java-8-max-min-sum-average-count

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值