Java 8 Stream API详解

一、Stream API介绍

Java 8引入了全新的Stream API,此Stream与Java I/O包里的InputStream和OutputStream是完全不同的概念,它不同于StAX对XML解析的Stream,也不同于Amazon Kinesis对大数据实时处理的Stream。Stream API更像具有Iterable的集合类,但行为和集合类又有所不同,它是对集合对象功能的增强,专注于对集合对象进行各种非常便捷、高效的聚合操作或大批量数据操作。

Stream API引入的目的在于弥补Java函数式编程的缺陷。对于很多支持函数式编程的语言,map()、reduce()基本上都内置到语言的标准库中了,不过,Java 8的Stream API总体来讲仍然是非常完善和强大,足以用很少的代码完成许多复杂的功能。

Java 8的Stream API充分利用Lambda表达式的特性,极大的提高编程效率和程序可读性。同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用fork/join并行方式来拆分任务和加速处理过程。通常编写并行代码很难而且容易出错,但使用Stream API无需编写一行多线程的代码,就可以很方便地写出高性能的并发程序。

在Stream API中,一个流基本上代表一个元素序列,Stream API提供了丰富的操作函数来计算这些元素。以前我们在开发业务应用时,通常很多操作的实现是这样做的:我们使用循环对集合做遍历,针对集合中的元素实现各种操作,定义各种变量来实现目的,这样我们就得到了一大堆丑陋的顺序代码。

如果我们使用Stream API做同样的事情,使用Lambda表达式和其它函数进行抽象,可以使得代码更易于理解、更为干净。有了这些抽象,还可以做一些优化,比如实现并行等。

二、Stream API实例

1. 使用IntStream移除常规的循环

比如在控制台输出0~9的例子:
注意需import java.util.stream.IntStream;

IntStream.range(0, 10).forEach(value -> System.out.println(value));
  • 1

2. 计算列表中的元素数

注意需

import java.util.List;import java.util.stream.Collectors;import java.util.stream.IntStream;List<Integer> list = IntStream.range(1, 100).boxed().collect(Collectors.toList());System.out.println(list.stream().count());
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

3. 计算列表中元素的平均数

Double avarage = list.stream().collect(Collectors.averagingInt(item -> item));
  • 1

4. 对列表元素进行统计

List<Integer> list = IntStream.range(1, 100).boxed().collect(Collectors.toList());IntSummaryStatistics iss = list.stream().collect(Collectors.summarizingInt(value -> value));System.out.println(iss);
  • 1
  • 2
  • 3


输出结果:

IntSummaryStatistics{count=99, sum=4950, min=1, average=50.000000, max=99}
  • 1

5. 根据List创建Map

List<Integer> list = IntStream.range(1, 100).boxed().collect(Collectors.toList());Map<Integer, Integer> map = list.stream().collect(Collectors.toMap(p -> p, q->q*3));System.out.println(map);
  • 1
  • 2
  • 3

输出结果:

{1=3, 2=6, 3=9, 4=12, 5=15, 6=18, 7=21, 8=24, 9=27, 10=30, 11=33, 12=36, 13=39, 14=42, 15=45, 16=48, 17=51, 18=54, 19=57, 20=60, 21=63, 22=66, 23=69, 24=72, 25=75, 26=78, 27=81, 28=84, 29=87, 30=90, 31=93, 32=96, 33=99, 34=102, 35=105, 36=108, 37=111, 38=114, 39=117, 40=120, 41=123, 42=126, 43=129, 44=132, 45=135, 46=138, 47=141, 48=144, 49=147, 50=150, 51=153, 52=156, 53=159, 54=162, 55=165, 56=168, 57=171, 58=174, 59=177, 60=180, 61=183, 62=186, 63=189, 64=192, 65=195, 66=198, 67=201, 68=204, 69=207, 70=210, 71=213, 72=216, 73=219, 74=222, 75=225, 76=228, 77=231, 78=234, 79=237, 80=240, 81=243, 82=246, 83=249, 84=252, 85=255, 86=258, 87=261, 88=264, 89=267, 90=270, 91=273, 92=276, 93=279, 94=282, 95=285, 96=288, 97=291, 98=294, 99=297}
  • 1

6. 求列表元素的最大数

List<Integer> list = new Random().ints(-100,100).limit(250).boxed().collect(Collectors.toList());Optional<Integer> max = list.stream().reduce(Math::max);max.ifPresent(value -> System.out.println(value));
  • 1
  • 2
  • 3

7. 从一堆姓名列表中找出以字母“C”开头的姓名

​String[] names = { "Fred Edwards", "Anna Cox", "Deborah Patterson", "Ruth Torres", "Shawn Powell",                "Rose Thompson", "Rachel Barnes", "Eugene Ramirez", "Earl Flores", "Janice Reed", "Sarah Miller",                "Patricia Kelly", "Carl Hall", "Craig Wright", "Martha Phillips", "Thomas Howard", "Steve Martinez",                "Diana Bailey", "Kathleen Hughes", "Russell Anderson", "Theresa Perry" };List<String> ls = Arrays.asList(names).stream().filter(s -> s.startsWith("C")).collect(Collectors.toList());System.out.println(ls.toString());
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

8. 把所有的姓名大写、排序,再输出

String[] names = { "Fred Edwards", "Anna Cox", "Deborah Patterson", "Ruth Torres", "Shawn Powell",                "Rose Thompson", "Rachel Barnes", "Eugene Ramirez", "Earl Flores", "Janice Reed", "Sarah Miller",                "Patricia Kelly", "Carl Hall", "Craig Wright", "Martha Phillips", "Thomas Howard", "Steve Martinez",                "Diana Bailey", "Kathleen Hughes", "Russell Anderson", "Theresa Perry" };Arrays.asList(names)         .stream()         .map(String::toUpperCase)         .sorted().forEach(System.out::println);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

三、更复杂的例子

1. 创建一个Person类

public class Person {    private String name;    private int age;    public Person(String name, int age) {        super();        this.name = name;        this.age = age;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    @Override    public String toString() {        return name;    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

2. 根据年龄对Person进行分组

Map<Integer, List<Person>> collect = persons.stream().collect(Collectors.groupingBy(Person::getAge));
  • 1

3. 对所有Person求平均年龄

Double collect = persons.stream().collect(Collectors.averagingInt(Person::getAge));
  • 1

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

Java 8 Stream API详解相关推荐

  1. Java 8 Stream API详解--转

    原文地址:http://blog.csdn.net/chszs/article/details/47038607 Java 8 Stream API详解 一.Stream API介绍 Java 8引入 ...

  2. java 8 stream reduce详解和误区

    文章目录 简介 reduce详解 总结 java 8 stream reduce详解和误区 简介 Stream API提供了一些预定义的reduce操作,比如count(), max(), min() ...

  3. 【java8新特性】——Stream API详解(二)

    一.简介 java8新添加了一个特性:流Stream.Stream让开发者能够以一种声明的方式处理数据源(集合.数组等),它专注于对数据源进行各种高效的聚合操作(aggregate operation ...

  4. Stream Api详解

    参考资料: 高级搜索 Stream 1. 什么是stream API Java8提供的stream API可以让程序员像操作数据库一样操作集合.Stream API可以极大提高Java程序员的生产力, ...

  5. Java 8 Date-Time API 详解

    从Java版本1.0开始就支持日期和时间,主要通过java.util.Date类. 但是,Date类设计不佳. 例如,Date中的月份从1开始,但从日期却从0开始.在JDK 1.1中使用它的许多方法已 ...

  6. java.lang类在电脑哪个位置_Java中的java.lang.Class API 详解

    且将新火试新茶,诗酒趁年华. 概述 Class是一个位于java.lang包下面的一个类,在Java中每个类实例都有对应的Class对象.类对象是由Java虚拟机(JVM)自动构造的. Class类的 ...

  7. Java 11中的新功能和API详解系列1

    Java 11中的新功能和API详解系列1 2018.9.27 版权声明:本文为博主chszs的原创文章,未经博主允许不得转载. JDK 11在语言语法方面有一个小改动,增加了相当数量的新API,以及 ...

  8. java nio详解,Java NIO API详解

    Java NIO API详解 在JDK 1.4以前,Java的IO操作集中在java.io这个包中,是基于流的阻塞(blocking)API.对于大多数应用来说,这样的API使用很方 便,然而,一些对 ...

  9. java docur,JavaDoc生成API详解

    一.综述 1.1 简介 Javadoc 是 Java 自带的一种工具,其可以从程序源代码中抽取类.方法.成员等注释形成一个和源代码配套的API帮助文档.也就是说,只要在编写程序时以一套特定的标记[Ta ...

最新文章

  1. 腾讯云智能制造首次披露三大战略布局,发布“511”生态伙伴计划
  2. validate验证长度 vue_vue input 输入校验字母数字组合且长度小于30的实现代码
  3. AndroidStudio导入新项目一直卡在Building gradle project
  4. javascript 数组排序
  5. 今天学习啦所谓的高级语言啦
  6. 2020蓝桥杯省赛---java---B---7(单词分析)
  7. 车牌识别与计算机编程,基于计算机视觉的车牌字符识别技术的研究
  8. OpenGL的几何变换[转]
  9. Spring中的@Autowired自动装配
  10. windows下Docker的下载与安装
  11. 最基础内网ip地址配置
  12. 逆向之制作扫雷外挂——003
  13. html新浪短域名api,新浪短网址API接口
  14. JS语法之:require
  15. 轩迅汇如何做好个人定位?定位越早,受益越多
  16. 制造业ERP如何做好成本核算管理?
  17. 【线刷大师】纯净root线刷包,线刷教程及工具
  18. STM32CubeMX | 31-使用硬件FMC读写SDRAM(W9825G6KH)
  19. iOS 15.1即将上线,iPhone13的“苹果手表解锁”Bug已被修复
  20. 蚂蚁金服网红技术团队分享,用 JavaScript 全栈打造商业级应用

热门文章

  1. Docker上部署GitLab , 搭建私有Git仓库 (基于Docker镜像sameersbn/docker-gitlab)
  2. SpringBoot之项目启动
  3. AduSkin - UI 追求极致,永臻完美
  4. Spring Boot整合Servlet,Filter,Listener,访问静态资源
  5. html5和flash播放器
  6. JavaScript异步编程【下】 -- Generator、Async/await
  7. 使用peewee增删查改数据库
  8. dropbox免费容量_免费课程:使用ES6和Dropbox构建费用管理器
  9. 中学编程_您可以从30岁的第一次编程采访中学到什么
  10. 我如何使用Python帮助我选择了Google Summer of Code '19的组织