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

Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。
Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。

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

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

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

元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。 数据源 流的来源。 可以是集合,数组,I/Ochannel, 产生器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功能举例

首先创建一个用户的实体类,包括姓名、年龄、性别、地址、赏金 几个属性


import lombok.Data;import java.math.BigDecimal;
@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;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +", sex=" + sex +", money=" + money +", address='" + address + '\'' +'}';}}

我们在创建一个测试类,包含主方法,并创建一个数据源,作为我们测试的对象

public class Stream {public static List<User> users() {List<User> 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)),new User("陆佑劫", 45, 0, "不良人", new BigDecimal(600)),new User("张天师", 48, 0, "天师府", new BigDecimal(1100)),new User("蚩梦", 18, 1, "万毒窟", new BigDecimal(800)));return list;}

api方法应用``

filter过滤以及排序

    public static void main(String[] args) {//filter过滤(T-> boolean)List<User> list = users();//将集合转化为流过滤出年龄大于20的人List<User> newList = list.stream().filter(user -> user.getAge() > 16)//根据年龄排序.sorted(Comparator.comparing(user -> user.getAge())).collect(Collectors.toList());System.out.println(newList);}输出:[User{name='姬如雪', age=17, sex=1, money=800, address='幻音坊'}, User{name='李星云', age=18, sex=0, money=1000, address='渝州'}, User{name='蚩梦', age=18, sex=1, money=800, address='万毒窟'}, User{name='蚩梦', age=18, sex=1, money=800, address='万毒窟'}, User{name='张子凡', age=19, sex=0, money=900, address='天师府'}, User{name='陆佑劫', age=45, sex=0, money=600, address='不良人'}, User{name='陆佑劫', age=45, sex=0, money=600, address='不良人'}, User{name='张天师', age=48, sex=0, money=1100, address='天师府'}, User{name='张天师', age=48, sex=0, money=1100, address='天师府'}, User{name='袁天罡', age=99, sex=0, money=100000, address='藏兵谷'}]

distinct 去重。排序。返回指定数据

  public static void main(String[] args) {//distinct 去重//数据源中复制new User("李星云", 18, 0, "渝州",new BigDecimal(1000)) 并粘贴两个List<User> list = users();List<User> newList = list.stream().distinct().sorted(Comparator.comparing(User::getAge))//根据年龄排序.limit(4)//返回前4个数据.collect(Collectors.toList());for (User user : newList) {System.out.println(user.getName() + "--->" + user.getAge());}}输出  : 陆林轩--->16
姬如雪--->17
李星云--->18
蚩梦--->18

排序后去除前N个元素

   public static void main(String[] args) {//去除前N个元素List<User> list=users();List<User> newList=list.stream().sorted(Comparator.comparing(User::getAge)).skip(2).collect(Collectors.toList());for (User user:newList){System.out.println(user.getName()+"-->" +user.getAge());}}输出:
李星云-->18
蚩梦-->18
蚩梦-->18
张子凡-->19
陆佑劫-->45
陆佑劫-->45
张天师-->48
张天师-->48
袁天罡-->99

map(T–R)

    public static void main(String[] args) {/*** map(T--R)*//*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</>)

  public static void main(String[] args) {/*  *flatMap(T-> Stream<R></>)* 这里原集合中的数据由逗号分割,使用split进行查拆分后,得到的是Stream<String【】></String【】* 字符串数组组成的流,要使用flatMap的Arrays::stream将Stream<String【】>转为Stream<String></>然后把流相连接*/List<String> flatMap = new ArrayList<>();flatMap.add("赵云,张飞");flatMap.add("孟婆,判官红,判官蓝");//此处间隔必须英文逗号flatMap.add("李白,韩信,鬼谷子");flatMap = flatMap.stream().map(s -> s.split(",")).flatMap(Arrays::stream).collect(Collectors.toList());for (String name : flatMap) {System.out.println(name);}}
输出:
赵云
张飞
孟婆
判官红
判官蓝
李白
韩信
鬼谷子

检测是否全部满足参数行为 所有参数数据是否都大于等于17 有小于则false 反之true

    public static void main(String[] args) {//allMatch(T->boolean)检测是否全部满足参数行为 所有参数数据是否都大于等于17 有小于则false 反之trueList<User> list=users();boolean flag=list.stream().allMatch(user -> user.getAge()>=17);System.out.println(flag);}输出:false

检测是否有任意元素满足给定的条件

  public static void main(String[] args) {//检测是否有任意元素满足给定的条件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 main(String[] args) {//noneMatchT->boolean)流中是否有元素匹配给定的T->boolean条件List<User> list = users();boolean flag = list.stream().noneMatch(user -> user.getAddress().contains("河南"));//用于string类型System.out.println(flag);}输出:true

findFirst():找到第一个元素

    public static void main(String[] args) {//findFirst():找到第一个元素List<User> list = users();Optional<User> optionalUser = list.stream().sorted(Comparator.comparing(User::getAge)).findFirst();System.out.println(optionalUser.toString());}输出:Optional[User{name='陆林轩', age=16, sex=1, money=500, address='渝州'}]

找到任意一个元素

    public static void main(String[] args) {//找到任意一个元素List<User> list = users();// Optional<User> optionalUser=list.stream()//  .findAny();Optional<User> optionalUser1=list.stream().findAny();System.out.println(optionalUser1.toString());}输出:Optional[User{name='李星云', age=18, sex=0, money=1000, address='渝州'}]

计算总数

    public static void main(String[] args) {//*计算总数List<User> list = users();long count = list.stream().count();System.out.println(count);}输出11

最大值最小值

    public static void main(String[] args) {//最大值最小值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 main(String[] args) {//求和 平均值List<User> list  =users();int totalAge=list.stream().collect(Collectors.summingInt(User::getAge));System.out.println("totalAge-->"+totalAge);//获得列表对象金额 使用reduce聚合函数,实现累加器BigDecimal totalMoney=list.stream().map(User::getMoney).reduce(BigDecimal.ZERO,BigDecimal::add);System.out.println(totalMoney);double avgAge=list.stream().collect(Collectors.averagingInt(User::getAge));System.out.println("avgAge--> " + avgAge);}输出:totalAge-->391
108200
avgAge--> 35.54545454545455

一次性得到元素的个数,总和。最大值,最小值

    public static void main(String[] args) {//*一次性得到元素的个数,总和。最大值,最小值List<User> list = users();IntSummaryStatistics statistics = list.stream().collect(Collectors.summarizingInt(User::getAge));System.out.println(statistics);}输出:IntSummaryStatistics{count=11, sum=391, min=16, average=35.545455, max=99}

拼接

    public static void main(String[] args) {//拼接List<User> list  =users();String names=list.stream().map(User::getName).collect(Collectors.joining(","));System.out.println(names);}输出:
李星云,陆林轩,姬如雪,袁天罡,张子凡,陆佑劫,张天师,蚩梦,陆佑劫,张天师,蚩梦

分组

    public static void main(String[] args) {//分组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>>> map1=users().stream().collect(Collectors.groupingBy(User::getSex,Collectors.groupingBy(User::getAge)));System.out.println(new Gson().toJson(map1));}输出:
{"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},{"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},{"name":"蚩梦","age":18,"sex":1,"address":"万毒窟","money":800}]}{"0":{"48":[{"name":"张天师","age":48,"sex":0,"address":"天师府","money":1100},{"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},{"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},{"name":"蚩梦","age":18,"sex":1,"address":"万毒窟","money":800}]}}Process finished with exit code 0

分组合计

    public static void main(String[] args) {//分组合计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=7, 1=4}
{0=7, 1=2}

分区

    public static void main(String[] args) {//分区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},{"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},{"name":"蚩梦","age":18,"sex":1,"address":"万毒窟","money":800}]}

Java8新特性 Stream流常用方法相关推荐

  1. Java8新特性 stream流常用方法

    Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据. Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达 ...

  2. Java8新特性Stream流详解

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

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

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

  4. java8新特性stream流

    参考自深蓝至尊的Java8 新特性之流式数据处理 一. 流式处理简介 在我接触到java8流式处理的时候,我的第一感觉是流式处理让集合操作变得简洁了许多,通常我们需要多行代码才能完成的操作,借助于流式 ...

  5. Java8新特性——Stream流:不同于IO流的流,操作集合数据

    文章目录 Stream流 1.认识Stream流(源码说明) 1.1.Stream流和Collection的区别 1.2.流的获取方式 1.3.流操作和管道 1.4.并行性 1.5.不干扰内政 1.6 ...

  6. 【Stream】java8新特性Stream流总结

    一.什么是stream 在 java8 中增加了一个新的抽象接口 Stream API,使用 Stream 操作集合类似于使用 SQL 语句数据库查找数据类似,提供直观的方法进行操作. Stream ...

  7. java8新特性 Stream流的优雅操作

    1. 使用传统的方式,遍历集合,对集合中的数据进行过滤 //创建一个List集合,存储姓名List<String> list = new ArrayList<>();list. ...

  8. Java8新特性stream流的优雅操作

    文章目录 原因是因为我管理的小组提交代码被我review到了,发现只有个别同学使用到了stream流,所以出此blog,希望大家都写出优雅的代码 原因是因为我管理的小组提交代码被我review到了,发 ...

  9. 利用Java8新特性stream流给集合中的某个属性赋值

    今天在编写一个返回对象VO时,需要做一些处理,返回对象VO如下: CollectListVO @Data @JsonIgnoreProperties(ignoreUnknown = true) @Ap ...

最新文章

  1. 这样就算会了PHP么?-10
  2. ASP.NET Core 1.0 使用 MySQL for EF Core 1.0 (.NET Core 1.0)
  3. [转帖]2019 简易Web开发指南
  4. secureCRt中文乱码问题
  5. 腾讯医疗AI实验室:3篇论文被国际顶尖会议收录
  6. step by step to download equipment via request download
  7. day28 socket网络编程
  8. 【UI设计师必备】完美色彩搭配超级实用GUI的素材
  9. configure: error: Please reinstall the libcurl distribution - easy.h should be ……
  10. 引入springboot的两种方式以及springboot容器的引入
  11. 开盘前1.5秒下单可追涨停股
  12. 2022-2028年中国现代服务行业企业投资项目指引及机会战略分析报告
  13. 【Tools】XD_Laser安装教程详解
  14. CSS实现鼠标悬停缩放
  15. LeetCode 491 递增子序列
  16. ora-28040解决方法
  17. preg_match_all 和 preg_replace 区别
  18. docker仓库——搭建registry私有仓库
  19. 培训机构无线覆盖解决方案
  20. DC Motors – Voltage Vs. Output Speed Vs. Torque

热门文章

  1. NodeMcu arduino ESP8266 使用Ticker库(多任务处理)
  2. jsp汽车销售管理系统
  3. 打王者荣耀还不过瘾,腾讯绝悟AI这次还拿下了足球世界冠军
  4. Python3遇到问题unicodeescape codec cant decode bytes in position 2 3 truncated UXXXXXXXX escape解决办法
  5. 移动端开发使用rem时动态设置html的字体大小
  6. 路由器动态ip获取不到的处理办法
  7. Tomcat7 性能优化,提高并发-NIO模式
  8. [Qt]使用QSS的扁平化风格的小作业—— 附源码
  9. 汇编指令: JO、JNO、JB、JNB、JE、JNE、JBE、JA、JS、JNS、JP、JNP、JL
  10. 计算机专业设计(论文)内容及要求,简述计算机专业毕业论文的撰写要求