在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操作相关推荐

  1. java 8 lambda表达式list操作分组、过滤、求和、最值、排序、去重

    java8的lambda表达式提供了一些方便list操作的方法,主要涵盖分组.过滤.求和.最值.排序.去重.跟之前的传统写法对比,能少写不少代码. 新建实体类 package com.vvvtimes ...

  2. Java中Lambda表达式和stream的使用

    Java中Lambda表达式和stream的使用 转自 [*https://www.cnblogs.com/franson-2016/p/5593080.html*] 简介 (译者注:虽然看着很先进, ...

  3. lambda表达式——Stream管道流的map操作

    lambda表达式--Stream管道流的map操作 一.回顾Stream管道流map的基础用法 二.处理非字符串类型集合元素 三.再复杂一点:处理对象数据格式转换 四.flatMap 一.回顾Str ...

  4. 10个Java 8 Lambda表达式经典示例

    Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表 达式,它将允许我们将行为传到函数里.在J ...

  5. Java 8 Lambda 表达式详解

    版权声明:本文由吴仙杰创作整理,转载请注明出处:https://segmentfault.com/a/1190000009186509 1. 引言 在 Java 8 以前,若我们想要把某些功能传递给某 ...

  6. Java 8 Lambda表达式10个示例【存】

    PS:不能完全参考文章的代码,请参考这个文件http://files.cnblogs.com/files/AIThink/Test01.zip 在Java 8之前,如果想将行为传入函数,仅有的选择就是 ...

  7. Java中Lambda表达式的使用

    目录 1 简介 2  Lambda表达式的组成 2.1  Lambda表达式的函数式接口 2.2 对接口的要求 3 Lambda使用 3.1 基本使用 3.2 使用Lambdas和Streams 4 ...

  8. Java 8 Lambda 表达式被编译成了什么?

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取个gui 在了解了Java 8 Lambda的一些基本概念和应用后, 我们会 ...

  9. 设计模式的Java 8 Lambda表达式–命令设计模式

    在本博客中,我将说明如何使用Java 8 Lambda表达式以函数式编程方式实现命令模式 . 命令模式的目的是将请求封装为对象,从而为具有不同请求,队列或日志请求的客户端参数化,并支持相应的操作. 命 ...

最新文章

  1. IDEA打开html文件时显示错误browser error提示找不到chrome或者别的浏览器
  2. MySQL Group Replication 部署 (Single Master)
  3. 在使用 ADO.NET 导出 Excel 文件时,设置 IMEX=1 仍不能导出所有数据的解决办法
  4. wikioi 1294 全排列 dfs
  5. C#LeetCode刷题之#232-用栈实现队列​​​​​​​​​​​​​​(Implement Queue using Stacks)
  6. scrum回顾_[PM]敏捷开发之Scrum总结
  7. MySQL启动关闭服务巨慢,这样解决!
  8. 对《谈谈培训机构的骗局给新人一些建议》这篇博文的个人评论
  9. 广度优先搜索算法(Breath-first Search)是如何搜索一张图的?
  10. HightChar图表控件
  11. ai替代数据可视化_在药物发现中可视化AI初创公司
  12. 《你的灯亮着吗?》 读后感
  13. 斗鱼直播实时数据爬取
  14. ubuntu等linux发行版声卡、网卡、显卡驱动问题解决
  15. TSU-求最大最小数
  16. 游戏3D建模用到的有哪些软件?
  17. 132,怎样理解帝国和王朝的兴衰
  18. Linux极速上手,超全面总结,jdk使用教程
  19. 了解 C++ 之 typename
  20. 2023十大网络安全认证,有任何一个都薪资过万,你有几个了?

热门文章

  1. vue 3.0中设置网页title
  2. 学C语言找女朋友很难吗?进来看看别人是怎么做的
  3. 转载一篇好文章《你刚才在淘宝上买了一件东西》
  4. python 画散点图
  5. 软考:信息安全工程师5(应用安全)
  6. 链表 幸存 问题_电脑故障幸存的8个技巧
  7. docker php安装gd扩展_docker安装php扩展gd库
  8. 搜集到一些升级到XCode 8 的问题
  9. 文案不知道怎么写?为你分享自媒体人必学的几个文案写作技巧
  10. 关于移动360浏览器的收藏夹问题