Java8 新语法 stream 流操作

Stream

Java8 API新出的语法,以一种声明式的方式处理数据,类似于SQL,更直观,是对Java集合运算更高级的语法。

可以让处理集合数据更高效、更简洁、更直观,使代码一目了然。

Stream 其实可以看成工厂流水线工作,是把需要处理的数据集合看作一种流,在管道中传输,每个环节是依次完成,经过中间操作处理后,最后由最终操作得到处理后的结果;也有并行流。

实际操作一下:

模拟数据,实际中可以是数据库、网络数据、本地文件数据等

学生基本信息:
Student(sid=11, name=张三, addr=四川, age=23, height=175)
Student(sid=12, name=李四, addr=四川, age=38, height=168)
Student(sid=13, name=嬴政, addr=北京, age=26, height=185)
Student(sid=14, name=荆轲, addr=湖南, age=17, height=164)
Student(sid=15, name=曹操, addr=陕西, age=26, height=194)
Student(sid=16, name=盖聂, addr=云南, age=17, height=184)
Student(sid=17, name=刘邦, addr=北京, age=23, height=165)
Student(sid=18, name=王五, addr=四川, age=38, height=165)
Student(sid=19, name=刘备, addr=四川, age=50, height=174)
过滤 filter

查询大于25岁的学生

System.out.println("查询大于 25岁的 学生:");
List<Student> collect = students.stream()
		.filter(student->student.getAge() > 25)
		.collect(Collectors.toList());
collect.forEach(System.out::println);

结果:

Student(sid=12, name=李四, addr=四川, age=38, height=168)
Student(sid=13, name=嬴政, addr=北京, age=26, height=185)
Student(sid=15, name=曹操, addr=陕西, age=26, height=194)
Student(sid=18, name=王五, addr=四川, age=38, height=165)
Student(sid=19, name=刘备, addr=四川, age=50, height=174)
排序 sorted

按照年龄排序(从小到大):

System.out.println("按照年龄排序(从小到大):");
List<Student> sortList = students.stream()
		.sorted( (a,b)-> a.getAge() - b.getAge())
		.collect(Collectors.toList());
sortList.forEach(System.out::println);

结果:

Student(sid=14, name=荆轲, addr=湖南, age=17, height=164)
Student(sid=16, name=盖聂, addr=云南, age=17, height=184)
Student(sid=11, name=张三, addr=四川, age=23, height=175)
Student(sid=17, name=刘邦, addr=北京, age=23, height=165)
Student(sid=13, name=嬴政, addr=北京, age=26, height=185)
Student(sid=15, name=曹操, addr=陕西, age=26, height=194)
Student(sid=12, name=李四, addr=四川, age=38, height=168)
Student(sid=18, name=王五, addr=四川, age=38, height=165)
Student(sid=19, name=刘备, addr=四川, age=50, height=174)
求最大 max

获取最高的学生:

System.out.println("获取最高的学生:");
Student maxHeightStudent = students.stream()
		.max((a,b)->a.getHeight() - b.getHeight())
		.get();
System.out.println(maxHeightStudent);

结果:

获取最高的学生:
Student(sid=15, name=曹操, addr=陕西, age=26, height=194)
求和 reduce

获取所有学生的年龄和

Integer ageSum = students.stream()
	.reduce(0, 
			(a,b)-> a + b.getAge(), 
			(a,b)-> a + b);
System.out.println("所有学生的年龄总和:" + ageSum);

结果:

所有学生的年龄总和:258

类似:

Integer allStudentAge = students.stream()
		.map(Student::getAge)
		.reduce(0, Integer::sum);
System.out.println("获取所有人年龄之和:" + allStudentAge);

结果:

获取所有人年龄之和:258
list转Map

数组集合list转Map

Map<Integer, String> mapList = students.stream()
		.collect(
				Collectors.toMap(Student::getSid, 
						Student::getName));
mapList.forEach((k,v)->System.out.println(k + ": " + v));

结果:

16: 盖聂
17: 刘邦
18: 王五
19: 刘备
11: 张三
12: 李四
13: 嬴政
14: 荆轲
15: 曹操

类似:查询同一个地方的学生,根据学生地址分组

System.out.println("同一个地方的人:");
Map<String, List<Student>> addrMap = students.stream()
		.collect(Collectors.groupingBy(Student::getAddr));

// 输出
System.out.println(JSON.toJSONString(addrMap, SerializerFeature.PrettyFormat));

结果:

{
	"陕西":[
		{
			"addr":"陕西",
			"age":26,
			"height":194,
			"name":"曹操",
			"sid":15
		}
	],
	"四川":[
		{
			"addr":"四川",
			"age":23,
			"height":175,
			"name":"张三",
			"sid":11
		},
		{
			"addr":"四川",
			"age":38,
			"height":168,
			"name":"李四",
			"sid":12
		},
		{
			"addr":"四川",
			"age":38,
			"height":165,
			"name":"王五",
			"sid":18
		},
		{
			"addr":"四川",
			"age":50,
			"height":174,
			"name":"刘备",
			"sid":19
		}
	],
	"湖南":[
		{
			"addr":"湖南",
			"age":17,
			"height":164,
			"name":"荆轲",
			"sid":14
		}
	],
	"云南":[
		{
			"addr":"云南",
			"age":17,
			"height":184,
			"name":"盖聂",
			"sid":16
		}
	],
	"北京":[
		{
			"addr":"北京",
			"age":26,
			"height":185,
			"name":"嬴政",
			"sid":13
		},
		{
			"addr":"北京",
			"age":23,
			"height":165,
			"name":"刘邦",
			"sid":17
		}
	]
}
分组 groupingBy

根据 地方分组,求出 每个 地方最高的 身高

Map<String, Optional<Integer>> groupByList = students.stream()
		.collect(Collectors.groupingBy(Student::getAddr, 
				Collectors.mapping(Student::getHeight, 
				Collectors.maxBy((a,b)->a-b))));

groupByList.forEach((k,v)->System.out.println(k + " : " + v.get()));

结果:

陕西 : 194
四川 : 175
湖南 : 164
云南 : 184
北京 : 185

还可以:

求各个地方最高的人:

System.out.println("求各个地方最高的人:");
Map<String, Optional<Student>> groupMaxHeightStudentMap = students.stream()
		.collect(Collectors.groupingBy(Student::getAddr, 
		Collectors.mapping(a->a, 
				Collectors.maxBy((a,b)->a.getHeight() - b.getHeight()))));


groupMaxHeightStudentMap.forEach((k,v)->System.out.println(k + " : " + v.get()));

结果:

陕西 : Student(sid=15, name=曹操, addr=陕西, age=26, height=194)
四川 : Student(sid=11, name=张三, addr=四川, age=23, height=175)
湖南 : Student(sid=14, name=荆轲, addr=湖南, age=17, height=164)
云南 : Student(sid=16, name=盖聂, addr=云南, age=17, height=184)
北京 : Student(sid=13, name=嬴政, addr=北京, age=26, height=185)

刚开始写微信公众号,请多多关注,欢迎,多谢!
微信公众号:《Java学习积累》
请点一下订阅,多谢!!!
微信公众号:Java学习积累

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天涯共明月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值