java 8 流Stream 的简单认识
Stream 允许我们以声明的方式处理数据。
简介
- 在 Java 中,集合和数组是两种常见的数据结构
- 类似于 SQL 语句从数据库查询数据的形式,Stream 提供了对 Java 集合操作和表示的高度抽象。
- 要处理的元素集合被视为流,在流水线中进行传输。并可在流水线各节点处理这些元素,例如过滤,排序和聚合。
特点
- 不占用空间。Stream 只是数据源的视图,表现形式可以是数组、容器或者I/O通道。
- 流操作数据源,不会改变数据源。 例如: 过滤Stream后不会删除过滤的元素,而是生成一个新的不包含过滤元素的Stream
- 懒加载。 对Stream的操作只有在需要的时候才会执行。
- 不可重复消费。 在流的生命周期中,元素仅能被访问一次。
操作
流的创建
-
集合创建
List<String> list = Arrays.asList("Hello", "Word", "!"); Stream<String> stream = list.stream();
-
Stream自带的方法
Stream<String> streams = Stream.of("Hello", "Word", "!");
中间操作
- 多个中间操作组合形成流水线,中间操作返回的是一个新的Stream.
-
filter
System.out.println(streams.stream().filter((e) -> "Hello".equals(e))); strings.stream().filter(e -> !e.isEmpty()).forEach(System.out::println);
-
映射
- map(Function f):接收一个函数作为参数,该函数会被应用到流中的每个元素上,并将其映射成一个新的元素。
-
flatMap(Function> mapper):接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流
List<String> numbers = Arrays.asList("a","b"); numbers.stream().map(i -> i + i).forEach(System.out::println); Stream<List<String>> stream2 = Stream.of(Arrays.asList("H","E"), Arrays.asList("L", "L", "O")); stream2.flatMap(list -> list.stream()).forEach(System.out::println);
-
limit/skip
- limit 返回 Stream 中的前 N 个元素。skip 舍弃 Stream 中的前 N 个元素。
List<String> numbers = Arrays.asList("a","b"); numbers.stream().limit(1).forEach(System.out::println); numbers.stream().skip(1).forEach(System.out::println);
-
排序
- sorted():自然排序使用Comparable的int compareTo(T o)方法
- sorted(Comparator com):定制排序使用Comparator的int compare(T o1, T o2)方法
List<String> numbers = Arrays.asList("b","a"); numbers.stream().sorted().forEach(System.out::println); numbers.stream().sorted((x,y) -> y.compareTo(x)).forEach(System.out::println);
-
distinct
- 去重
List<String> numbers = Arrays.asList("b","a","b"); numbers.stream().distinct().forEach(System.out::println);
-
reduce
- 累加
System.out.println("=====reduce:将流中元素反复结合起来,得到一个值=========="); Stream<Integer> stream = Stream.iterate(1, x -> x+1).limit(200); //stream.forEach(System.out::println); Integer sum = stream.reduce(10,(x,y)-> x+y); System.out.println(sum);
终端操作
- 返回值不为Stream 的为终端操作(立即求值),终端操作不支持链式调用,会触发实际计算
- 执行过末端操作以后,Stream 不可再次使用,且不允许执行任何中间操作。
-
forEach
- 遍历
List<String> numbers = Arrays.asList("b","a","b"); numbers.stream().forEach(System.out::println);
-
count
- 统计个数
List<String> numbers = Arrays.asList("b","a"); numbers.stream().count();
-
collect
- 组合,返回对应的类型,包括list,set,treeset ,map 等
List<String> numbers = Arrays.asList("b","a"); numbers = numbers.stream().sorted().collect(Collectors.toList()); List<lambdaDemo> lambdaDemos = Arrays.asList(new lambdaDemo("zhang","bing",1), new lambdaDemo("li","hua",2)); Map<Integer,String> maps = lambdaDemos.stream().collect(Collectors.toMap(lambdaDemo::getAge,lambdaDemo::getName)); System.out.println(maps); //以年龄为唯一值, public static Map<Integer,lambdaDemo> check(List<lambdaDemo> lambdaDemos){ return lambdaDemos.stream().collect(Collectors.toMap(lambdaDemo::getAge, Function.identity(), (existing, replacement) -> existing)); }
-
分组和分区
- Collectors.groupingBy()对元素做group操作。
- Collectors.partitioningBy()对元素进行二分区操作。
public static void test9() { List<lambdaDemo> lambdaDemos = Arrays.asList(new lambdaDemo("zhang","黑人",65), new lambdaDemo("li","黑人",40), new lambdaDemo("liu","白人",40)); System.out.println("=======根据人的肤色进行分组=========================="); Map<String, List<lambdaDemo>> map = lambdaDemos.stream().collect(Collectors.groupingBy(lambdaDemo::getName)); System.out.println(map); System.out.println("=======根据人的年龄范围多级分组=========================="); Map<Integer, Map<String, List<lambdaDemo>>> map2 = lambdaDemos.stream().collect(Collectors.groupingBy(lambdaDemo::getAge, Collectors.groupingBy( ( p ) -> { if ( p.getAge() > 60 ) { return "老年人"; } else { return "年轻人"; } } ) )); System.out.println(map2); } public static void test10() { List<lambdaDemo> lambdaDemos = Arrays.asList(new lambdaDemo("zhang","黑人",60), new lambdaDemo("li","黑人",2), new lambdaDemo("liu","白人",3)); System.out.println("========根据人的年龄是否大于40进行分区========================"); Map<Boolean, List<lambdaDemo>> map = lambdaDemos.stream().collect(Collectors.partitioningBy(p -> p.getAge() > 40)); System.out.println(map); }
github博客列表地址
github
欢迎关注公众号,查看更多内容 :
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
什么是微服务?
什么是微服务?为什么会有微服务?让我们带着这些疑问开始我们的探索。 我们先看下维基百科和百度百科给出的定义: 维基百科:2014年,Martin Fowler 与 James Lewis 共同提出了微服务的概念,定义了微服务是由以单一应用程序构成的小服务,自己拥有自己的行程与轻量化处理,服务依业务功能设计,以全自动的方式部署,与其他服务使用 HTTP API 通信。同时服务会使用最小的规模的集中管理 (例如 Docker) 能力,服务可以用不同的编程语言与数据库等组件实现。 百度百科:所谓的微服务是SOA架构下的最终产物,该架构的设计目标是为了肢解业务,使得服务能够独立运行。微服务设计原则:1、各司其职 2、服务高可用和可扩展性 概念还是比较抽象的,接下来,我将从单体应用开始,讲解为什么会有微服务以及什么是微服务。 单体应用 在初期,互联网公司的应用技术栈大致分为 LAMP(Linux + Apache + MySQL + PHP)和 MVC(Spring + iBatis/Hibernate + Tomcat)两大流派。两者都是为单体应用架构设计的,其优点是学习成本低,开发上手快,测...
- 下一篇
爬了各大搜索引擎,2019年Java面试题(集合+并发+调优+微服务)
Java集合22题 ArrayList 和 Vector 的区别。 说说 ArrayList,Vector, LinkedList 的存储性能和特性。 快速失败 (fail-fast) 和安全失败 (fail-safe) 的区别是什么? hashmap 的数据结构。 HashMap 的工作原理是什么? Hashmap 什么时候进行扩容呢? List、Map、Set 三个接口,存取元素时,各有什么特点? Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用 == 还是 equals()? 它们有何区别? 两个对象值相同 (x.equals(y) == true),但却可有不同的 hash code,这句话对不对? heap 和 stack 有什么区别。 Java 集合类框架的基本接口有哪些? HashSet 和 TreeSet 有什么区别? HashSet 的底层实现是什么? LinkedHashMap 的实现原理? 为什么集合类没有实现 Cloneable 和 Serializable 接口? 什么是迭代器 (Iterator)? Iterator 和 ListIter...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- CentOS7设置SWAP分区,小内存服务器的救世主
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS6,CentOS7官方镜像安装Oracle11G
- Hadoop3单机部署,实现最简伪集群
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7安装Docker,走上虚拟化容器引擎之路