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并行方式来拆分任务和加速处理过程。

通常编写并行代码非常难并且easy出错。但使用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));

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());

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

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

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);



输出结果:

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

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=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}

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));

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());

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. 创建一个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;
}
}

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

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

3. 对全部Person求平均年龄

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

最新文章

  1. SpringMVC入门
  2. 【web前端学习部落22群】分享 碰撞的小球开源小案例
  3. SSIS之-DTS对象&amp;事件
  4. c语言中三个点的解释 : variadic
  5. SHA-1 加密算法破解现已只需要 10 天
  6. bootstrap标签引入地址
  7. 03-JAVA方法
  8. Android中轴旋转特效实现,制作别样的图片浏览器
  9. JQuery判断数组中是否包含某个元素$.inArray(&quot;js&quot;, arr);
  10. Spring Data JPA教程, 第三部分: Custom Queries with Query Methods(翻译)
  11. 卸载Visual Studio Code后删除右键Open with Code&hellip;
  12. #BeginLibraryItem 的疑问...
  13. 经典SQL语句集锦
  14. 打开VMware的系统出错
  15. IntelliJ IDEA中类似Eclipse自动补全变量名称和属性名称的快捷键
  16. .Net Core 2.0 EntityFrameworkCore CodeFirst入门教程
  17. DTD约束
  18. 【php增删改查实例】第十节 - 部门管理模块(新增功能)
  19. String字符串类总结
  20. springboot 定时任务

热门文章

  1. MBR和GPT分区学习
  2. python3编写登录接口
  3. Hdu 1429 胜利大逃亡(续) (bfs+状态压缩)
  4. [luogu] P3745 [六省联考2017]期末考试 (贪心)
  5. tp框架引入第三方sdk的经验总结
  6. MyBatis学习总结(1)——MyBatis快速入门
  7. Eclipse删除多余工作空间
  8. spring boot和maven的约定大于配置体现在哪些方面
  9. httpclient就是个能发送http连接的工具包,包括能发送post请求和get请求
  10. Oracle性能分析1:开启SQL跟踪和获取trace文件