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 ...
随机推荐
- inline-block 导致元素下沉 解决方法添加vertical-align:middle属性
<div class="layui-input-block"> <input name="username" lay-verify=" ...
- jekyll介绍安装.github静态页面工具
jekyll build # => 当前文件夹中的内容将会生成到 ./site 文件夹中. $ jekyll build --destination <destination> # ...
- 28. Python编写自动化测试用例
接口文档已经提供了,requests库.unittest单元测试框架也已经介绍过,笔者相信读者朋友已经可以独立编写接口自动化测试用例了.但是有一些细节,我们需要聊一下.比如我们写登录接口测试用例,用户 ...
- PAT_A1097#Deduplication on a Linked List
Source: PAT A1097 Deduplication on a Linked List (25 分) Description: Given a singly linked list L wi ...
- Spring Cloud配置中心客户端读取配置
微服务连接配置中心来实现外部配置的读取. 引入依赖 <dependencies> <dependency> <groupId>org.springframework ...
- innobackupex2.4选项参考
该innobackupex2.4选项参考¶ 此页面记录了innobackupex的所有命令行选项. 选项 --apply-log BACKUP-DIR通过应用xtrabackup_logfile位于同 ...
- safari 调试iPhone web页面
safari设置-打开Safari偏好者设置,选中“高级菜单”,在页面最下方看到“在菜单中显示开发菜单”的复选框,在复选框内打钩,这样设置完毕就能在Safari菜单中看到开发菜单了 iPhone 设置 ...
- 2018-8-10-wpf-单例
title author date CreateTime categories wpf 单例 lindexi 2018-08-10 19:16:53 +0800 2018-2-13 17:23:3 + ...
- NFS(网络文件系统)
NFS(网络文件系统) 1.关于NFS介绍 1.1NFS在企业中的应用场景 在企业集群架构的工作场景中,NFS网络文件系统一般被用来存储共享视频,图片,附件等静态资源文件,通常网站用户上传的文件都会放 ...
- windows如何在当前路径下快速打开cmd
直接在打开的文件夹地址栏当中输入cmd即可.