Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。

Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。

Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。

这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。

元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。

Stream(流)是一个来自数据源的元素队列并支持聚合操作

元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。
数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。
聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。
和以前的Collection操作不同, Stream操作还有两个基础的特征:

Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。
这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。
内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。
Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。
在 Java 8 中, 集合接口有两个方法来生成流:

stream() − 为集合创建串行流。
parallelStream() − 为集合创建并行流。
API功能举例
首先创建一个用户的实体类,包括姓名、年龄、性别、地址、赏金 几个属性

@Data
public class User {
//姓名
private String name;
//年龄
private Integer age;
//性别
private Integer sex;
//地址
private String address;
//赏金
private BigDecimal money;

public User(String name, Integer age, Integer sex, String address,BigDecimal money) {this.name = name;this.age = age;this.sex = sex;this.address = address;this.money = money;
}@Override
public String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +", sex=" + sex +", money=" + money +", address='" + address + '\'' +'}';
}

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
我们在创建一个测试类,包含主方法,并创建一个数据源,作为我们测试的对象

public class Stream {
public static void main(String[] args) {
}
public static List users(){
List list = Arrays.asList(
new User(“李星云”, 18, 0, “渝州”,new BigDecimal(1000)),
new User(“陆林轩”, 16, 1, “渝州”,new BigDecimal(500)),
new User(“姬如雪”, 17, 1, “幻音坊”,new BigDecimal(800)),
new User(“袁天罡”, 99, 0, “藏兵谷”,new BigDecimal(100000)),
new User(“张子凡”, 19, 0, “天师府”,new BigDecimal(900)),
new User(“陆佑劫”, 45, 0, “不良人”,new BigDecimal(600)),
new User(“张天师”, 48, 0, “天师府”,new BigDecimal(1100)),
new User(“蚩梦”, 18, 1, “万毒窟”,new BigDecimal(800))
);
return list;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
api实例

/*filter过滤(T-> boolean)*/
public static void filter(){List<User> list = users();List<User> newlist = list.stream().filter(user -> user.getAge() > 20).collect(Collectors.toList());for (User user : newlist) {System.out.println(user.getName()+" --> "+ user.getAge());}
}
---结果---
袁天罡 --> 99
陆佑劫 --> 45
张天师 --> 48/*distinct 去重*/
数据源中复制new User("李星云", 18, 0, "渝州",new BigDecimal(1000)) 并粘贴两个
public static void distinct(){List<User> list = users();List<User> newlist = list.stream().distinct().collect(Collectors.toList());for (User user : newlist) {System.out.println(user.getName()+" --> "+ user.getAge());}
}
---结果---
李星云 --> 18
陆林轩 --> 16
姬如雪 --> 17
袁天罡 --> 99
张子凡 --> 19
陆佑劫 --> 45
张天师 --> 48
蚩梦 --> 18/*sorted排序*/
public static void sorted(){List<User> list = users();List<User> newlist = list.stream().sorted(Comparator.comparingInt(User::getAge)).collect(Collectors.toList());for (User user : newlist) {System.out.println(user.getName()+" --> "+ user.getAge());}
}
---结果---
陆林轩 --> 16
姬如雪 --> 17
李星云 --> 18
蚩梦 --> 18
张子凡 --> 19
陆佑劫 --> 45
张天师 --> 48
袁天罡 --> 99/*limit返回前n个元素*/
public static void limit(){List<User> list = users();List<User> newlist = list.stream().sorted(Comparator.comparingInt(User::getAge)).limit(2).collect(Collectors.toList());for (User user : newlist) {System.out.println(user.getName()+" --> "+ user.getAge());}
}
---结果---
陆林轩 --> 16
姬如雪 --> 17/*skip去除前n个元素*/
public static void skip(){List<User> list = users();List<User> newlist = list.stream().sorted(Comparator.comparingInt(User::getAge)).skip(2).collect(Collectors.toList());for (User user : newlist) {System.out.println(user.getName()+" --> "+ user.getAge());}
}
---结果---
李星云 --> 18
蚩梦 --> 18
张子凡 --> 19
陆佑劫 --> 45
张天师 --> 48
袁天罡 --> 99/*map(T->R)*/
public static void map(){List<User> list = users();List<String> newlist = list.stream().map(User::getName).distinct().collect(Collectors.toList());for (String add : newlist) {System.out.println(add);}
}
---结果---
李星云
陆林轩
姬如雪
袁天罡
张子凡
陆佑劫
张天师
蚩梦/*flatMap(T -> Stream<R>)*/
public static void flatmap(){List<String> flatmap = new ArrayList<>();flatmap.add("常宣灵,常昊灵");flatmap.add("孟婆,判官红,判官蓝");/*这里原集合中的数据由逗号分割,使用split进行拆分后,得到的是Stream<String[]>,字符串数组组成的流,要使用flatMap的Arrays::stream将Stream<String[]>转为Stream<String>,然后把流相连接*/flatmap = flatmap.stream().map(s -> s.split(",")).flatMap(Arrays::stream).collect(Collectors.toList());for (String name : flatmap) {System.out.println(name);}
}
---结果---
常宣灵
常昊灵
孟婆
判官红
判官蓝/*allMatch(T->boolean)检测是否全部满足参数行为*/
public static void allMatch(){List<User> list = users();boolean flag = list.stream().allMatch(user -> user.getAge() >= 17);System.out.println(flag);
}
---结果---
false/*anyMatch(T->boolean)检测是否有任意元素满足给定的条件*/
public static void anyMatch(){List<User> list = users();boolean flag = list.stream().anyMatch(user -> user.getSex() == 1);System.out.println(flag);
}
---结果---
true/*noneMatchT->boolean)流中是否有元素匹配给定的 T -> boolean条件*/
public static void noneMatch(){List<User> list = users();boolean flag = list.stream().noneMatch(user -> user.getAddress().contains("郑州"));System.out.println(flag);
}
---结果---
true/*findFirst( ):找到第一个元素*/
public static void findfirst(){List<User> list = users();Optional<User> optionalUser = list.stream().sorted(Comparator.comparingInt(User::getAge)).findFirst();System.out.println(optionalUser.toString());
}
---结果---
Optional[User{name='陆林轩', age=16, sex=1, money=500, address='渝州'}]/*findAny( ):找到任意一个元素*/
public static void findAny(){List<User> list = users();

// Optional optionalUser = list.stream()
.findAny();
Optional optionalUser = list.stream()
.findAny();
System.out.println(optionalUser.toString());
}
—结果—
Optional[User{name=‘李星云’, age=18, sex=0, money=1000, address=‘渝州’}]

/*计算总数*/
public static void count(){List<User> list = users();long count = list.stream().count();System.out.println(count);
}
---结果---
8/*最大值最小值*/
public static void max_min(){List<User> list = users();Optional<User> max = list.stream().collect(Collectors.maxBy(Comparator.comparing(User::getAge)));Optional<User> min = list.stream().collect(Collectors.minBy(Comparator.comparing(User::getAge)));System.out.println("max--> " + max+"  min--> "+ min);
}

—结果—
max–> Optional[User{name=‘袁天罡’, age=99, sex=0, money=100000, address=‘藏兵谷’}] min–> Optional[User{name=‘陆林轩’, age=16, sex=1, money=500, address=‘渝州’}]

/*求和_平均值*/
public static void sum_avg(){List<User>list = users();int totalAge = list.stream().collect(Collectors.summingInt(User::getAge));System.out.println("totalAge--> "+ totalAge);/*获得列表对象金额, 使用reduce聚合函数,实现累加器*/BigDecimal totalMpney = list.stream().map(User::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add);System.out.println("totalMpney--> " + totalMpney);double avgAge = list.stream().collect(Collectors.averagingInt(User::getAge));System.out.println("avgAge--> " + avgAge);
}

—结果—
totalAge–> 280
totalMpney–> 105700
avgAge–> 35.0

/*一次性得到元素的个数、总和、最大值、最小值*/
public static void allVlaue(){List<User> list = users();IntSummaryStatistics statistics = list.stream().collect(Collectors.summarizingInt(User::getAge));System.out.println(statistics);
}

—结果—
IntSummaryStatistics{count=8, sum=280, min=16, average=35.000000, max=99}

/*拼接*/
public static void join(){List<User> list = users();String names = list.stream().map(User::getName).collect(Collectors.joining(", "));System.out.println(names);
}

—结果—
李星云, 陆林轩, 姬如雪, 袁天罡, 张子凡, 陆佑劫, 张天师, 蚩梦

/*分组*/public static void group(){Map<Integer, List<User>> map = users().stream().collect(Collectors.groupingBy(User::getSex));System.out.println(new Gson().toJson(map));System.out.println();Map<Integer, Map<Integer,List<User>>> map2 = users().stream().collect(Collectors.groupingBy(User::getSex,Collectors.groupingBy(User::getAge)));System.out.println(new Gson().toJson(map2));
}

—结果—
{“0”:[{“name”:“李星云”,“age”:18,“sex”:0,“address”:“渝州”,“money”:1000},{“name”:“袁天罡”,“age”:99,“sex”:0,“address”:“藏兵谷”,“money”:100000},{“name”:“张子凡”,“age”:19,“sex”:0,“address”:“天师府”,“money”:900},{“name”:“陆佑劫”,“age”:45,“sex”:0,“address”:“不良人”,“money”:600},{“name”:“张天师”,“age”:48,“sex”:0,“address”:“天师府”,“money”:1100}],“1”:[{“name”:“陆林轩”,“age”:16,“sex”:1,“address”:“渝州”,“money”:500},{“name”:“姬如雪”,“age”:17,“sex”:1,“address”:“幻音坊”,“money”:800},{“name”:“蚩梦”,“age”:18,“sex”:1,“address”:“万毒窟”,“money”:800}]}

{“0”:{“48”:[{“name”:“张天师”,“age”:48,“sex”:0,“address”:“天师府”,“money”:1100}],“18”:[{“name”:“李星云”,“age”:18,“sex”:0,“address”:“渝州”,“money”:1000}],“19”:[{“name”:“张子凡”,“age”:19,“sex”:0,“address”:“天师府”,“money”:900}],“99”:[{“name”:“袁天罡”,“age”:99,“sex”:0,“address”:“藏兵谷”,“money”:100000}],“45”:[{“name”:“陆佑劫”,“age”:45,“sex”:0,“address”:“不良人”,“money”:600}]},“1”:{“16”:[{“name”:“陆林轩”,“age”:16,“sex”:1,“address”:“渝州”,“money”:500}],“17”:[{“name”:“姬如雪”,“age”:17,“sex”:1,“address”:“幻音坊”,“money”:800}],“18”:[{“name”:“蚩梦”,“age”:18,“sex”:1,“address”:“万毒窟”,“money”:800}]}}

/*分组合计*/
public static void groupCount(){Map<Integer, Long> num = users().stream().collect(Collectors.groupingBy(User::getSex, Collectors.counting()));System.out.println(num);Map<Integer, Long> num2 = users().stream().filter(user -> user.getAge()>=18).collect(Collectors.groupingBy(User::getSex, Collectors.counting()));System.out.println(num2);
}

—结果—
{0=5, 1=3}
{0=5, 1=1}

/*分区*/
public static void partitioningBy(){List<User> list = users();Map<Boolean, List<User>> part = list.stream().collect(Collectors.partitioningBy(user -> user.getAge() <= 30));System.out.println(new Gson().toJson(part));
}

—结果—
{“false”:[{“name”:“袁天罡”,“age”:99,“sex”:0,“address”:“藏兵谷”,“money”:100000},{“name”:“陆佑劫”,“age”:45,“sex”:0,“address”:“不良人”,“money”:600},{“name”:“张天师”,“age”:48,“sex”:0,“address”:“天师府”,“money”:1100}],“true”:[{“name”:“李星云”,“age”:18,“sex”:0,“address”:“渝州”,“money”:1000},{“name”:“陆林轩”,“age”:16,“sex”:1,“address”:“渝州”,“money”:500},{“name”:“姬如雪”,“age”:17,“sex”:1,“address”:“幻音坊”,“money”:800},{“name”:“张子凡”,“age”:19,“sex”:0,“address”:“天师府”,“money”:900},{“name”:“蚩梦”,“age”:18,“sex”:1,“address”:“万毒窟”,“money”:800}]}

JDK8新特性Stream流使用详解相关推荐

  1. stream流_最详细的JDK8新特性————Stream流

    Stream流 在Java 8中,得益于Lambda所带来的函数式编程,引入了一个全新的Stream概念,用于解决已有集合类库既有的弊 端. 传统集合的多步遍历代码: 几乎所有的集合(如Collect ...

  2. Java JDK8新特性Stream流

    1.Stream流 1. 流,支持处理数据处理操作的源生成的元素序列.流有两个重要特性:1流水线:很多流操作本身会返回一个流,这样多的操作就可以链接起来,形成一个大的流水线.2,内部迭代.流的迭代是在 ...

  3. JDK8 新特性Stream流的常用方法

    流表示包含着一系列元素的集合,我们可以对其做不同类型的操作,用来对这些元素执行计算 二.中间流的部分应用 中间操作会再次返回一个流,所以,我们可以链接多个中间操作,注意这里是不用加分号的. /* St ...

  4. Java8新特性Stream流详解

    陈老老老板 说明:新的专栏,本专栏专门讲Java8新特性,把平时遇到的问题与Java8的写法进行总结,需要注意的地方都标红了,一起加油. 本文是介绍Java8新特性Stream流常用方法超详细教学 说 ...

  5. java的collect用法_java8新特性:stream流中collect用法

    java8新特性:stream流中collect用法 java8新特性:stream流中collect用法 1.toList List collectList = Stream.of(1, 2, 3, ...

  6. Spark 3.2.0 版本新特性 push-based shuffle 论文详解(一)概要和介绍

    前言 本文隶属于专栏<大数据技术体系>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见大数据技术体系 目录 Spark 3.2.0 ...

  7. Spark 3.2.0 版本新特性 push-based shuffle 论文详解(二)背景和动机

    前言 本文隶属于专栏<大数据技术体系>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见大数据技术体系 目录 Spark 3.2.0 ...

  8. Java复习第11天---11.4---Java8新特性---Stream流常用方法3和综合案例

    Java复习第11天---11.4---Java8新特性---Stream流常用方法3和综合案例 目录 文章目录 1.count:计数-终结方法 2.limit:取前几个元素-延迟方法 3.skip: ...

  9. Java复习第11天---11.3---Java8新特性---Stream流特点和常用方法2

    Java复习第11天---11.3---Java8新特性---Stream流特点和常用方法2 目录 文章目录 1.Stream流特点 2.filter:过滤 3.map:映射 ***后记*** : 内 ...

最新文章

  1. Java中的static关键字解析 转载
  2. python编程初学者指南pdf-Python物理建模初学者指南
  3. JVM优化过程全记录
  4. usnews 计算机专业排名,2019美国大学USNews计算机专业排名
  5. php 不识别redis,redis,_redis卡死无法读取数据如何解决?,redis - phpStudy
  6. Csharp: Treeview check list value
  7. java 监听request_ServletRequest 监听器
  8. java苹果沙盒验证参数问题_php – iOS7 – 收据未在沙盒验证 – 错误21002(java.lang.IllegalArgumentException)...
  9. 7-8 猜数字 (20 分)
  10. windows通过bat批处理命令,快速清理系统垃圾文件,释放硬盘空间
  11. origin 一键导出文件夹中所有图形
  12. 怎么查询显卡hdmi接口版本_HDMI接口基础知识大扫盲
  13. html上下两个箭头符号怎么打出来,往返双箭头符号怎么打
  14. 基于阿里云和Arduino的化学环境系统检测,支持钉钉机器人告警(MQ2、MQ3、MQ7、DHT11 完整源码以及实现步骤)
  15. C语言,利用二维数组及条件语句计算闰年和平年每月所对应的天数
  16. Android 修改系统默认输入法
  17. ICCV 2021 Oral | 金字塔视觉Transformer(PVT):用于密集预测的多功能backbone
  18. 基于OCR模板匹配的手写英文字母数字识别matlab仿真
  19. 【每日一题】蜗牛爬井问题
  20. echart echart-gl

热门文章

  1. 程序员的幽默笑话(深意爆笑)
  2. [介绍]关于我与我的未来
  3. 快速启动软件之 Rolan ,你真的会用?
  4. linux限制message日志大小,message显示rsyslog日志服务警告信息due to rate-limiting
  5. C++-Nuget包一键打包-上传工具开发分享
  6. pandas read_excel 和 to_excel 读写Excel的参数详解
  7. 使用Java编写爬虫,下载百度图片
  8. 跨境电商面临“寒冬”考验,如何转型升级入局新赛道(Starday)
  9. [BJOI2019]勘破神机(斯特林数,数论)
  10. 如何做好线上活动策划及执行的思路与框架