• 免费教程
  • 培训费用
  • 零基础学
  • 学习路线
  • 就业前景
  • 职业发展

电话:400-996-5531

美国上市公司,专注Java培训22年

达内Java培训校区地址

校区地址

  • 【热点话题】
  • Java技术干货
  • Java学习教程
  • Java学习笔记
  • Java面试题
  • Java培训问答
  • Java培训机构哪些好
  • Java职场就业
  • Java Stream API入门教程


    你可能没意识到 Java对函数式编程的重视程度,看看Java 8加入函数式编程扩充多少功能就清楚了。Java 8之所以费这么大功夫引入函数式编程,原因有二:

    代码简洁,函数式编程写出的代码简洁且意图明确,使用stream接口让你从此告别for循环。

    多核友好,Java函数式编程使得编写并行程序从未如此简单,你需要的全部就是调用一下parallel()方法。

    这一节我们学习stream,也就是Java函数式编程的主角。对于Java 7来说stream完全是个陌生东西,stream并不是某种数据结构,它只是数据源的一种视图。这里的数据源可以是一个数组,Java容器或I/O channel等。正因如此要得到一个stream通常不会手动创建,而是调用对应的工具方法,比如:

    调用Collection.stream()或者Collection.parallelStream()方法;

    调用Arrays.stream(T[] array)方法。

    常见的stream接口继承关系如图:

    【Java Stream API入门教程】

    图中4种stream接口继承自BaseStream,其中IntStream, LongStream, DoubleStream对应三种基本类型(int, long, double,注意不是包装类型),Stream对应所有剩余类型的stream视图。为不同数据类型设置不同stream接口,可以1.提高性能,2.增加特定接口函数。

    【Java Stream API入门教程】

    你可能会奇怪为什么不把IntStream等设计成Stream的子接口?毕竟这接口中的方法名大部分是一样的。答案是这些方法的名字虽然相同,但是返回类型不同,如果设计成父子接口关系,这些方法将不能共存,因为Java不允许只有返回类型不同的方法重载。

    虽然大部分情况下stream是容器调用Collection.stream()方法得到的,但stream和collections有以下不同:

    无存储。stream不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一个数组,Java容器或I/O channel等。

    为函数式编程而生。对stream的任何修改都不会修改背后的数据源,比如对stream执行过滤操作并不会删除被过滤的元素,而是会产生一个不包含被过滤元素的新stream。

    惰式执行。stream上的操作并不会立即执行,只有等到用户真正需要结果的时候才会执行。

    可消费性。stream只能被“消费”一次,一旦遍历过就会失效,就像容器的迭代器那样,想要再次遍历必须重新生成。

    对stream的操作分为为两类,中间操作(intermediate operations)和结束操作(terminal operations),二者特点是:

    中间操作总是会惰式执行,调用中间操作只会生成一个标记了该操作的新stream,仅此而已。

    结束操作会触发实际计算,计算发生时会把所有中间操作积攒的操作以pipeline的方式执行,这样可以减少迭代次数。计算完成之后stream就会失效。

    如果你熟悉Apache Spark RDD,对stream的这个特点应该不陌生。

    下表汇总了Stream接口的部分常见方法:

    【Java Stream API入门教程】

    区分中间操作和结束操作最简单的方法,就是看方法的返回值,返回值为stream的大都是中间操作,否则是结束操作。

    stream方法使用

    stream跟函数接口关系非常紧密,没有函数接口stream就无法工作。回顾一下:函数接口是指内部只有一个抽象方法的接口。通常函数接口出现的地方都可以使用Lambda表达式,所以不必记忆函数接口的名字。

    forEach()

    我们对forEach()方法并不陌生,在Collection中我们已经见过。方法签名为void forEach(Consumer action),作用是对容器中的每个元素执行action指定的动作,也就是对元素进行遍历。

    // 使用Stream.forEach()迭代

    Stream stream = Stream.of("I", "love", "you", "too");

    stream.forEach(str -> System.out.println(str));

    由于forEach()是结束方法,上述代码会立即执行,输出所有字符串。

    filter()

    【Java Stream API入门教程】

    函数原型为Stream filter(Predicate predicate),作用是返回一个只包含满足predicate条件元素的Stream。

    // 保留长度等于3的字符串

    Stream stream= Stream.of("I", "love", "you", "too");

    stream.filter(str -> str.length()==3)

    .forEach(str -> System.out.println(str));

    上述代码将输出为长度等于3的字符串you和too。注意,由于filter()是个中间操作,如果只调用filter()不会有实际计算,因此也不会输出任何信息。

    distinct()

    【Java Stream API入门教程】

    函数原型为Stream distinct(),作用是返回一个去除重复元素之后的Stream。

    Stream stream= Stream.of("I", "love", "you", "too", "too");

    stream.distinct()

    .forEach(str -> System.out.println(str));

    上述代码会输出去掉一个too之后的其余字符串。

    sorted()

    排序函数有两个,一个是用自然顺序排序,一个是使用自定义比较器排序,函数原型分别为Stream sorted()和Stream sorted(Comparator comparator)。

    Stream stream= Stream.of("I", "love", "you", "too");

    stream.sorted((str1, str2) -> str1.length()-str2.length())

    .forEach(str -> System.out.println(str));

    上述代码将输出按照长度升序排序后的字符串,结果完全在预料之中。

    map()

    【Java Stream API入门教程】

    函数原型为 Stream map(Function mapper),作用是返回一个对当前所有元素执行执行mapper之后的结果组成的Stream。直观的说,就是对每个元素按照某种操作进行转换,转换前后Stream中元素的个数不会改变,但元素的类型取决于转换之后的类型。

    Stream stream = Stream.of("I", "love", "you", "too");

    stream.map(str -> str.toUpperCase())

    .forEach(str -> System.out.println(str));

    上述代码将输出原字符串的大写形式。

    flatMap()

    【Java Stream API入门教程】

    函数原型为 Stream flatMap(Function> mapper),作用是对每个元素执行mapper指定的操作,并用所有mapper返回的Stream中的元素组成一个新的Stream作为最终返回结果。说起来太拗口,通俗的讲flatMap()的作用就相当于把原stream中的所有元素都”摊平”之后组成的Stream,转换前后元素的个数和类型都可能会改变。

    Stream> stream = Stream.of(Arrays.asList(1,2), Arrays.asList(3, 4, 5));

    stream.flatMap(list -> list.stream())

    .forEach(i -> System.out.println(i));

    上述代码中,原来的stream中有两个元素,分别是两个List,执行flatMap()之后,将每个List都“摊平”成了一个个的数字,所以会新产生一个由5个数字组成的Stream。所以最终将输出1~5这5个数字。

    结语

    截止到目前我们感觉良好,已介绍StreamAPI理解起来并不费劲儿。如果你就此以为函数式编程不过如此,恐怕是高兴地太早了。下一节对Stream规约操作的介绍将刷新你现在的认识。


    【免责声明】本文部分系转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,如涉及作品内容、版权和其它问题,请在30日内与我们联系,我们会予以重改或删除相关文章,以保证您的权益!

    上一篇: 各学科编程入门书籍推荐
    下一篇: Java培训班分享:Java 9 中的 9 个新特性

    猜你喜欢

    查看更多>>
    • C#和Java哪个更值得学?

      2024-07-01

    • Java设计模式和应用场景?

      2024-06-24

    • Java主流框架都有哪些?

      2024-06-24

    最新文章

    • 2024年Java后端工程师薪资待遇

      2024-07-03

    • Java入门到精通需要多久?

      2024-07-03

    • 精通Java工资能有多少?

      2024-07-03

    Java开发高端课程免费试学

    大咖讲师+项目实战全面提升你的职场竞争力

    • 海量实战教程
    • 1V1答疑解惑
    • 行业动态分析
    • 大神学习路径图

    相关推荐

    更多

    达内就业喜报

    更多>
  • 2024年8月达内Java培训学员就业喜报
  • 2024年7月达内Java培训学员就业喜报
  • 2024年6月达内Java培训学员就业喜报
  • 2024年5月达内Java培训学员就业喜报
  • 2024年4月达内Java培训学员就业喜报
  • Java开班时间

    • 北京 丨 10月30日

      火速抢座
    • 上海 丨 10月30日

      火速抢座
    • 广州 丨 10月30日

      火速抢座
    • 兰州 丨 10月30日

      火速抢座
    • 杭州 丨 10月30日

      火速抢座
    • 南京 丨 10月30日

      火速抢座
    • 沈阳 丨 10月30日

      火速抢座
    • 大连 丨 10月30日

      火速抢座
    • 长春 丨 10月30日

      火速抢座
    • 哈尔滨 丨 10月30日

      火速抢座
    • 济南 丨 10月30日

      火速抢座
    • 青岛 丨 10月30日

      火速抢座
    • 烟台 丨 10月30日

      火速抢座
    • 西安 丨 10月30日

      火速抢座
    • 天津 丨 10月30日

      火速抢座
    • 石家庄 丨 10月30日

      火速抢座
    • 保定 丨 10月30日

      火速抢座
    • 郑州 丨 10月30日

      火速抢座
    • 合肥 丨 10月30日

      火速抢座
    • 太原 丨 10月30日

      火速抢座
    • 苏州 丨 10月30日

      火速抢座
    • 武汉 丨 10月30日

      火速抢座
    • 成都 丨 10月30日

      火速抢座
    • 重庆 丨 10月30日

      火速抢座
    • 厦门 丨 10月30日

      火速抢座
    • 福州 丨 10月30日

      火速抢座
    • 珠海 丨 10月30日

      火速抢座
    • 南宁 丨 10月30日

      火速抢座
    • 东莞 丨 10月30日

      火速抢座
    • 贵阳 丨 10月30日

      火速抢座
    • 昆明 丨 10月30日

      火速抢座
    • 洛阳 丨 10月30日

      火速抢座
    • 临沂 丨 10月30日

      火速抢座
    • 潍坊 丨 10月30日

      火速抢座
    • 运城 丨 10月30日

      火速抢座
    • 呼和浩特丨10月30日

      火速抢座
    • 长沙 丨 10月30日

      火速抢座
    • 南昌 丨 10月30日

      火速抢座
    • 宁波 丨 10月30日

      火速抢座
    • 深圳 丨 10月30日

      火速抢座
    • 大庆 丨 10月30日

      火速抢座

    Java培训问答

    更多>
  • C#和Java哪个更值得学?
  • Java设计模式和应用场景?
  • Java主流框架都有哪些?
  • C++和Java哪个更值得学?
  • Java前端和后端的区别
  • Java工程师是青春饭吗?
  • Java面试题库

    更多>
  • Java基础考试题及答案
  • Java面试题目:Java关键词汇总
  • 达内java培训解答meta标签的作用
  • 程序员半小时内必须解决的5个编程问题
  • 常见10大Java main面试问题
  • 大数据技术简单面试题推荐
  • Java推荐栏目

    • Java教程

    • Java学习

    • Java开班

    • Java就业

    • Java职场

    • Java资讯

    收起

    玻璃钢生产厂家供应玻璃钢雕塑定做玻璃钢采耳雕塑佛像玻璃钢雕塑生产厂家建安玻璃钢雕塑定制深圳商业街玻璃钢雕塑玻璃钢雕塑造型设计珠海玻璃钢奶牛雕塑嘉兴佛像玻璃钢雕塑巩义玻璃钢动物雕塑和田玻璃钢雕塑制作厂家乌鲁木齐商场美陈公司玻璃钢花盆利与弊深圳厂家玻璃钢雕塑资讯无锡玻璃钢人物雕塑价格大庆玻璃钢雕塑负责商场美陈开发业务玻璃钢雕塑为什么会有裂纹园林雕塑玻璃钢宣武区玻璃钢花盆南京玻璃钢人物雕塑价格水富市玻璃钢雕塑怎么样普洱商场美陈清河玻璃钢花盆花器广州玻璃钢雕塑摆件销售企业开封玻璃钢泡沫雕塑报价宿州景区玻璃钢雕塑报价合肥设计玻璃钢雕塑费用玻璃钢蛇果雕塑广州透明玻璃钢雕塑厂家东昌玻璃钢花盆花器香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

    玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化