Java 8 Lambda 表达式Stream操作
在jdk1.8新的stream包中针对集合的操作也提供了并行操作流和串行操作流。并行流就是把内容切割成多个数据块,并且使用多个线程分别处理每个数据块的内容。
优点:
Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
以前对集合遍历都是通过Iterator或者For-Each的方式,显式的在集合外部进行迭代,这叫做外部迭代。Stream提供了内部迭代的方式,通过访问者模式(Visitor)实现。
1.实体类
package com.money.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {private String name;private String sex;private int age;private String province;private String city;
}
2. Steam流操作
package com.money.service;import com.money.pojo.Person;import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;public class StreamDemo {public static void main(String[] args) {// 添加集合List<Person> personList = new ArrayList<>();personList.add(new Person("王安石","man",24,"江西","抚州"));personList.add(new Person("黄庭坚","man",25,"江西","九江"));personList.add(new Person("程长文","woman",22,"江西","上饶"));personList.add(new Person("文天祥","man",25,"江西","吉安"));personList.add(new Person("欧阳修","man",24,"江西","吉安"));personList.add(new Person("顾恺之","man",28,"江苏","无锡"));personList.add(new Person("李煜","man",29,"江苏","徐州"));personList.add(new Person(" 刘邦","man",28,"江苏","徐州"));personList.add(new Person("赵飞燕","woman",21,"江苏","苏州"));personList.add(new Person("周恩来","man",24,"江苏","淮安"));// 过滤List<Person> list1 = personList.stream().filter(p -> p.getProvince().equals("江苏")).collect(Collectors.toList());System.out.println("list1 = " + list1);// 映射List<String> list2 = personList.stream().map(Person::getName).collect(Collectors.toList());System.out.println("list2 = " + list2);// 分部,按照性别Map<Boolean, List<Person>> listMap = personList.stream().collect(Collectors.partitioningBy(person -> person.getSex().equals("woman")));System.out.println("listMap = " + listMap);// 分组, 按照省份和城市Map<String, Map<String, List<Person>>> cityMap = personList.stream().collect(Collectors.groupingBy(Person::getProvince, Collectors.groupingBy(Person::getCity)));System.out.println("cityMap = " + cityMap);// 平均值Map<String, Map<String, Double>> avgAgeMap = personList.stream().collect(Collectors.groupingBy(Person::getProvince, Collectors.groupingBy(Person::getCity, Collectors.averagingInt(Person::getAge))));System.out.println("avgAgeMap = " + avgAgeMap);// 排序Map<String, List<Person>> ageSort = personList.stream().collect(Collectors.groupingBy(Person::getSex, Collectors.collectingAndThen(Collectors.toList(), s -> {s.sort(Comparator.comparing(Person::getAge));return s;})));System.out.println("ageSort = " + ageSort);}
}
3.实现效果
过滤出江苏省:
list1 = [Person(name=顾恺之, sex=man, age=28, province=江苏, city=无锡), Person(name=李煜, sex=man, age=29, province=江苏, city=徐州), Person(name= 刘邦, sex=man, age=28, province=江苏, city=徐州), Person(name=赵飞燕, sex=woman, age=21, province=江苏, city=苏州), Person(name=周恩来, sex=man, age=24, province=江苏, city=淮安)]
映射姓名:
list2 = [王安石, 黄庭坚, 程长文, 文天祥, 欧阳修, 顾恺之, 李煜, 刘邦, 赵飞燕, 周恩来]按照性别分部:
listMap = {false=[Person(name=王安石, sex=man, age=24, province=江西, city=抚州), Person(name=黄庭坚, sex=man, age=25, province=江西, city=九江), Person(name=文天祥, sex=man, age=25, province=江西, city=吉安), Person(name=欧阳修, sex=man, age=24, province=江西, city=吉安), Person(name=顾恺之, sex=man, age=28, province=江苏, city=无锡), Person(name=李煜, sex=man, age=29, province=江苏, city=徐州), Person(name= 刘邦, sex=man, age=28, province=江苏, city=徐州), Person(name=周恩来, sex=man, age=24, province=江苏, city=淮安)], true=[Person(name=程长文, sex=woman, age=22, province=江西, city=上饶), Person(name=赵飞燕, sex=woman, age=21, province=江苏, city=苏州)]}按照省份和城市分组:
cityMap = {江苏={徐州=[Person(name=李煜, sex=man, age=29, province=江苏, city=徐州), Person(name= 刘邦, sex=man, age=28, province=江苏, city=徐州)], 淮安=[Person(name=周恩来, sex=man, age=24, province=江苏, city=淮安)], 无锡=[Person(name=顾恺之, sex=man, age=28, province=江苏, city=无锡)], 苏州=[Person(name=赵飞燕, sex=woman, age=21, province=江苏, city=苏州)]}, 江西={上饶=[Person(name=程长文, sex=woman, age=22, province=江西, city=上饶)], 抚州=[Person(name=王安石, sex=man, age=24, province=江西, city=抚州)], 吉安=[Person(name=文天祥, sex=man, age=25, province=江西, city=吉安), Person(name=欧阳修, sex=man, age=24, province=江西, city=吉安)], 九江=[Person(name=黄庭坚, sex=man, age=25, province=江西, city=九江)]}}按照城市求年龄平均值:
avgAgeMap = {江苏={徐州=28.5, 淮安=24.0, 无锡=28.0, 苏州=21.0}, 江西={上饶=22.0, 抚州=24.0, 吉安=24.5, 九江=25.0}}按照性别分组后再按年龄排序:
ageSort = {woman=[Person(name=赵飞燕, sex=woman, age=21, province=江苏, city=苏州), Person(name=程长文, sex=woman, age=22, province=江西, city=上饶)], man=[Person(name=王安石, sex=man, age=24, province=江西, city=抚州), Person(name=欧阳修, sex=man, age=24, province=江西, city=吉安), Person(name=周恩来, sex=man, age=24, province=江苏, city=淮安), Person(name=黄庭坚, sex=man, age=25, province=江西, city=九江), Person(name=文天祥, sex=man, age=25, province=江西, city=吉安), Person(name=顾恺之, sex=man, age=28, province=江苏, city=无锡), Person(name= 刘邦, sex=man, age=28, province=江苏, city=徐州), Person(name=李煜, sex=man, age=29, province=江苏, city=徐州)]}
Java 8 Lambda 表达式Stream操作相关推荐
- java 8 lambda表达式list操作分组、过滤、求和、最值、排序、去重
java8的lambda表达式提供了一些方便list操作的方法,主要涵盖分组.过滤.求和.最值.排序.去重.跟之前的传统写法对比,能少写不少代码. 新建实体类 package com.vvvtimes ...
- Java中Lambda表达式和stream的使用
Java中Lambda表达式和stream的使用 转自 [*https://www.cnblogs.com/franson-2016/p/5593080.html*] 简介 (译者注:虽然看着很先进, ...
- lambda表达式——Stream管道流的map操作
lambda表达式--Stream管道流的map操作 一.回顾Stream管道流map的基础用法 二.处理非字符串类型集合元素 三.再复杂一点:处理对象数据格式转换 四.flatMap 一.回顾Str ...
- 10个Java 8 Lambda表达式经典示例
Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表 达式,它将允许我们将行为传到函数里.在J ...
- Java 8 Lambda 表达式详解
版权声明:本文由吴仙杰创作整理,转载请注明出处:https://segmentfault.com/a/1190000009186509 1. 引言 在 Java 8 以前,若我们想要把某些功能传递给某 ...
- Java 8 Lambda表达式10个示例【存】
PS:不能完全参考文章的代码,请参考这个文件http://files.cnblogs.com/files/AIThink/Test01.zip 在Java 8之前,如果想将行为传入函数,仅有的选择就是 ...
- Java中Lambda表达式的使用
目录 1 简介 2 Lambda表达式的组成 2.1 Lambda表达式的函数式接口 2.2 对接口的要求 3 Lambda使用 3.1 基本使用 3.2 使用Lambdas和Streams 4 ...
- Java 8 Lambda 表达式被编译成了什么?
点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取个gui 在了解了Java 8 Lambda的一些基本概念和应用后, 我们会 ...
- 设计模式的Java 8 Lambda表达式–命令设计模式
在本博客中,我将说明如何使用Java 8 Lambda表达式以函数式编程方式实现命令模式 . 命令模式的目的是将请求封装为对象,从而为具有不同请求,队列或日志请求的客户端参数化,并支持相应的操作. 命 ...
最新文章
- IDEA打开html文件时显示错误browser error提示找不到chrome或者别的浏览器
- MySQL Group Replication 部署 (Single Master)
- 在使用 ADO.NET 导出 Excel 文件时,设置 IMEX=1 仍不能导出所有数据的解决办法
- wikioi 1294 全排列 dfs
- C#LeetCode刷题之#232-用栈实现队列​​​​​​​​​​​​​​(Implement Queue using Stacks)
- scrum回顾_[PM]敏捷开发之Scrum总结
- MySQL启动关闭服务巨慢,这样解决!
- 对《谈谈培训机构的骗局给新人一些建议》这篇博文的个人评论
- 广度优先搜索算法(Breath-first Search)是如何搜索一张图的?
- HightChar图表控件
- ai替代数据可视化_在药物发现中可视化AI初创公司
- 《你的灯亮着吗?》 读后感
- 斗鱼直播实时数据爬取
- ubuntu等linux发行版声卡、网卡、显卡驱动问题解决
- TSU-求最大最小数
- 游戏3D建模用到的有哪些软件?
- 132,怎样理解帝国和王朝的兴衰
- Linux极速上手,超全面总结,jdk使用教程
- 了解 C++ 之 typename
- 2023十大网络安全认证,有任何一个都薪资过万,你有几个了?