JDK8新特性之Stream流
是什么是Stream流
java.util.stream.Stream
Stream流和传统的IO流,它们都叫流,却是两个完全不一样的概念和东西。
流可以简单的说是处理数据集合的东西,可以申明式流式API来处理集合,而不是写一个逻辑实现。
流分类
流分为顺序流及并行流,顺序流即每个指令按顺序执行,并行流即集合里面的操作并行执行。
List<Integer> numbers = Arrays.asList(1, 2, 3);
// 顺序流
numbers.stream().forEach(n -> System.out.print(n));
//并行流
numbers.parallelStream().forEach(n -> System.out.print(n));
以上例子,顺序流总是输出123
,而并行流则每次结果都不一定,并行流使用了ForkJoinPool分而治之,所以明白了ForkJoinPool原理的同学就知道并行流的真面目了。
创建流
1、调用集合的stream()方法或者parallelStream()方法。
2、Stream.of()方法,有针对int,long的专用流IntStream,LongStream。
使用流
以下举了流的一些常用的用法。
public class StreamTest {
public static void main(String[] args) {
System.out.println("过滤-找出年纪大于18岁的人");
List<User> list = initList();
list.stream().filter((User user) -> user.getAge() > 18).collect(Collectors.toList())
.forEach(System.out::println);
System.out.println();
System.out.println("最大值-找出最大年纪的人");
list = initList();
Optional<User> max = list.stream().max((u1, u2) -> u1.getAge() - u2.getAge());
System.out.println(max.get());
System.out.println();
System.out.println("映射-规纳-求所有人的年纪总和");
list = initList();
Optional<Integer> reduce = list.stream().map(User::getAge).reduce(Integer::sum);
System.out.println(reduce.get());
System.out.println();
System.out.println("分组-按年纪分组");
list = initList();
Map<Integer, List<User>> userMap = list.stream()
.collect(Collectors.groupingBy(User::getAge));
MapUtils.verbosePrint(System.out, null, userMap);
System.out.println();
System.out.println("创建-去重-统计");
Stream<User> userStream = Stream
.of(new User("u1", 1), new User("u2", 21), new User("u2", 21));
System.out.println(userStream.distinct().count());
System.out.println();
}
public static List<User> initList() {
List<User> list = new ArrayList<>();
list.add(new User("oaby", 23));
list.add(new User("tom", 11));
list.add(new User("john", 16));
list.add(new User("jennis", 26));
list.add(new User("tin", 26));
list.add(new User("army", 26));
list.add(new User("mack", 19));
list.add(new User("jobs", 65));
list.add(new User("jordan", 23));
return list;
}
}
输出结果:
过滤-找出年纪大于18岁的人
User [username=oaby, age=23]
User [username=jennis, age=26]
User [username=tin, age=26]
User [username=army, age=26]
User [username=mack, age=19]
User [username=jobs, age=65]
User [username=jordan, age=23]
最大值-找出最大年纪的人
User [username=jobs, age=65]
映射-规纳-求所有人的年纪总和
235
分组-按年纪分组
{
16 = [User [username=john, age=16]]
65 = [User [username=jobs, age=65]]
19 = [User [username=mack, age=19]]
23 = [User [username=oaby, age=23], User [username=jordan, age=23]]
26 = [User [username=jennis, age=26], User [username=tin, age=26], User [username=army, age=26]]
11 = [User [username=tom, age=11]]
}
创建-去重-统计
2
可以看出流操作数据集合很强大吧,但需要注意的是流只能执行一次,再次使用需要重要打开。
更多的玩法可以自己去研究吧。
推荐阅读
分享Java干货,高并发编程,热门技术教程,微服务及分布式技术,架构设计,区块链技术,人工智能,大数据,Java面试题,以及前沿热门资讯等。
JDK8新特性之Stream流的更多相关文章
- JDK8新特性关于Stream流
在Java1.8之前还没有stream流式算法的时候,我们要是在一个放有多个User对象的list集合中,将每个User对象的主键ID取出,组合成一个新的集合,首先想到的肯定是遍历,如下: 1 2 3 ...
- Java 8 新特性之 Stream 流基础体验
Java 8 新特性之 Stream 流基础体验 package com.company; import java.util.ArrayList; import java.util.List; imp ...
- 乐字节-Java8新特性之Stream流(上)
上一篇文章,小乐给大家介绍了<Java8新特性之方法引用>,下面接下来小乐将会给大家介绍Java8新特性之Stream,称之为流,本篇文章为上半部分. 1.什么是流? Java Se中对于 ...
- java1.8新特性之stream流式算法
在Java1.8之前还没有stream流式算法的时候,我们要是在一个放有多个User对象的list集合中,将每个User对象的主键ID取出,组合成一个新的集合,首先想到的肯定是遍历,如下: List& ...
- 【Java8新特性】- Stream流
Java8新特性 - Stream流的应用 生命不息,写作不止 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! ...
- java8新特性之stream流
Stream 流是 Java 8 提供给开发者一套新的处理集合的API,他把我们将要处理的集合作为流,就像流水线一样,我们可以对其中的元素进行筛选,过滤,排序等中间操作,只不过这种操作更加简洁高效. ...
- Java8新特性之Stream流(含具体案例)
一.概述 Stream 流是 Java 8 新提供给开发者的一组操作集合的 API,将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选.排序.聚合等.元素 ...
- JDK8新特性之stream
stream中有很多方法,讲一些常用的. 1.forEach(),遍历方法,很简单,对于一般的遍历可以替代for循环 List<String> strings = Arrays.asLis ...
- jdk8新特性---list.stream
项目中用到了该api ,记录下来 具有get set 构造方法的实体类 开始使用: 结果为: 更多可以参考: https://blog.csdn.net/justloveyou_/article/de ...
随机推荐
- 25. SPI
- Rsync 实现服务器文件的同步——服务端的安装配置
一.安装rsync 直接使用yum命令进行安装即可. yum -y install rsync 二.配置文件 网上大多教程都说安装是默认没有配置文件的,但是经过我的尝试,yum安装下默认是有配置文件的 ...
- 对 HTTP HTTPS的认识
1.HTTP:超文本传输协议 -以明文的形式传输 -效率更高,但是不安全 2.HTTPS:HTTP+SSL -传输之前数据先加密,之后在揭秘 -效率低,但是安全 3.get请求和post请求的区别 - ...
- 修改maven包本地默认位置
前言 这段时间上岸了,就有时间整理电脑的资料(强迫症重度患者),就向maven以及gradle的仓库位置动手了. 目的 改变maven的默认位置 步骤 修改maven的配置文件setting.xml( ...
- multipart/form-data,application/json和application/x-www-form-urlencoded区别
application/json和application/x-www-form-urlencoded都是表单数据发送时的编码类型. EncType: enctype 属性规定在发送到服务器之前应该如何 ...
- android中使用MediaPlayer和SurfaceView播放视频
package com.test.video; import java.io.IOException; import android.media.AudioManager; import androi ...
- Java web 应用自启动 shell脚本自动重启
之前公司的内部管理系统jenkins自动构建代码有时候会失效,导致服务停掉. 于是乎就搞了一个自动启动脚本. oa.jar就是监测的服务 startup.sh 的内容是运行jar包的命令 java - ...
- 取消SVN感叹号即去除版本库
之前不小心直接将版本库 的内容检出 到桌面,后才发现桌面上的文件 都变成了问号,本来也以为没有多大问题,删除 .svn 即可,可是删除所有的.svn后,桌面上还是显示问号,刷新了很多次,还重启电脑 了 ...
- Spring下载maven
http://maven.springframework.org/release/org/springframework/spring/
- go类c语法
go类c语法 一般来说,如果一门语言具有类c语法,意味着当你习惯使用其他类c语言例如c.c++.java.javascript和c#,然后你就会发现go语言和它们也类似,至少表面上是.例如,使用&am ...