博客
关于我
Java泛型和Stream类型
阅读量:700 次
发布时间:2019-03-17

本文共 2994 字,大约阅读时间需要 9 分钟。

Java泛型与Stream技术深入解析

泛型是Java中的一种强类型参数化机制,允许定义方法时带有形式参数,并在调用时传递具体的实参。在Java中,泛型可以作为一种高效的类型管理手段,广泛应用于集合框架、接口实现以及数据处理等多个领域。本文将从基础到高级内容,深入探讨Java的泛型和Stream技术。


一、什么是泛型?

泛型是一种编程范式,允许定义方法时引入类型变量。类型变量通常以大写字母表示,常用的标识包括TEKV等。类型变量的具体类型在方法调用时由开发者提供,比如:

public class NormalGeneric
{ private T data; public NormalGeneric() {} public NormalGeneric(T data) { this(data); this.data = data; } }

此代码定义了一个通用类NormalGeneric<T>,其中包含一个类型变量T。类似地,接口也可以定义泛型:

public interface Generator
{ T next(); }

在实际使用中,泛型提示编译器进行类型检查,从而保证程序的安全性和灵活性。


二、泛型的应用场景

1. 泛型类与接口的实现

任何类或接口都可以定义泛型。例如,实现Generator接口的类可以写具体的逻辑:

public class ImplGenerator
implements Generator
{ private T data; public T next() { return data; } }

在使用时,可以通过提供具体类型来创建实例:

ImplGenerator
generator = new ImplGenerator<>("XiaoMing"); String result = generator.next(); // 返回String类型

或直接创建无需类型参数的实例:

ImplGenerator
generator = new ImplGenerator<>();

2. 泛型方法

Java支持方法级别的泛型定义,允许同一类中定义多种不同类型的方法。例如:

public class GenericMethod
{ public
U genericMethod(U u) { return u; } }

此方法在调用时可像普通方法一样使用:

String result = genericMethod("xiaoming");

对于数值类型的加法,泛型可以帮助避免多次编写重载方法:

public class NumberParser
{ public T parse(Number number) { if (number instanceof Integer) { return (T) ((Integer)number).intValue(); } else if (number instanceof Double) { return (T) ((Double)number).doubleValue(); } else { throw new RuntimeException("不支持的类型"); } } }

三、Stream技术解析

Stream(流)是Java8引入的一种高级数据处理API,主要用于处理集合中的数据。Stream可以通过Stream()parallelStream()获取,并支持一系列操作(如mapfiltersorted等)对数据进行处理。

1. Stream操作分类

Stream操作主要分为两类:

  • 中间操作:返回新的Stream实例,可以链式调用多个操作如mapfilter等。
  • 终结操作:执行最终计算,返回结果。

中间操作可分为两大类:

  • 无状态操作(如filtermap):仅依赖当前元素,不依赖前面元素的状态。
  • 有状态操作(如sorted):依赖整个Stream的元素。

终结操作可分为:

  • 短路操作:在遇到符合条件的元素时立即返回结果。
  • 非短路操作:必须处理完所有元素后才能返回结果。

2. Stream的底层实现

Stream的内部实现基于Spliterator(分片迭代器)和Sync spliterator。具体流程如下:

  • 创建Stream。2.调用中间操作,生成一个Sink链表。3.执行终结操作,触发Sink链表的处理过程。4.通过Spliterator遍历集合,执行Sink链表中的操作,最终返回结果。
  • 左右主要操作框架: Stream -> pipeline -> Sink        |               |        v               vIterator       chave     ReducingSink

    在分布式处理(如parallelStream())中,数据会被分成块,分别处理后重新合并结果。


    四、Stream性能分析

    在实际应用中,Stream的性能取决于操作类型和线程池配置。

    1. 常规数据迭代与Stream的比较

    • 常规迭代:代码简单,执行效率较高。
    • Stream串行处理:依赖ForkJoin线程池,执行效率较低。
    • Stream并行处理:利用多线程加速,性能优于串行处理,但可能不足以超过常规迭代的速度(尤其是对于小数据)。

    对比结果表明,Stream并行处理在面对大数据时大幅超越常规迭代方法,尤其是在汪小半GB级数据时(如100MB、500MB、1GB等数据):

    Stream xls对比1亿数据:常规迭代 < Stream串行 < Stream并行2千数据: Stream并行 > Stream串行 > 常规迭代240线程池:1亿数据:Stream并行 > 常规迭代 > Stream串行2千数据:Stream并行 > Stream串行 > 常规迭代

    五、如何合理使用Stream

  • 小数据或无并发需求:直接使用标准的foreach循环或其他简洁方式。
  • 大数据并发需求:使用parallelStream(),尤其是在数据量大的情况下`.
  • 避免不必要的并行:避免使用过多并行操作,如parallelStream中的数据分割和重新合并带来的开销。
  • 此外,注意线程池配置,默认情况下,ForkJoin线程池的并行度由系统属性-D แม尔ت-thread-count确定,建议避免设置过高的线程池数量。


    通过上述分析可以看出,泛型和Stream技术为Java开发提供了强大的工具,尤其能在处理泛型接口实现和大数据流操作中发挥重要作用。正确使用这些技术能够显著提升代码的可读性和效率,同时也能避免繁复的强制类型转换。

    转载地址:http://mhbez.baihongyu.com/

    你可能感兴趣的文章
    Mysql 学习总结(86)—— Mysql 的 JSON 数据类型正确使用姿势
    查看>>
    Mysql 学习总结(87)—— Mysql 执行计划(Explain)再总结
    查看>>
    Mysql 学习总结(88)—— Mysql 官方为什么不推荐用雪花 id 和 uuid 做 MySQL 主键
    查看>>
    Mysql 学习总结(89)—— Mysql 库表容量统计
    查看>>
    mysql 实现主从复制/主从同步
    查看>>
    mysql 审核_审核MySQL数据库上的登录
    查看>>
    mysql 导入 sql 文件时 ERROR 1046 (3D000) no database selected 错误的解决
    查看>>
    mysql 导入导出大文件
    查看>>
    MySQL 导出数据
    查看>>
    mysql 将null转代为0
    查看>>
    mysql 常用
    查看>>
    MySQL 常用列类型
    查看>>
    mysql 常用命令
    查看>>
    Mysql 常见ALTER TABLE操作
    查看>>
    MySQL 常见的 9 种优化方法
    查看>>
    MySQL 常见的开放性问题
    查看>>
    Mysql 常见错误
    查看>>
    mysql 常见问题
    查看>>
    MYSQL 幻读(Phantom Problem)不可重复读
    查看>>
    mysql 往字段后面加字符串
    查看>>