文章目录

什么是Stream流

创建Stream流

使用Stream流(常用API)

fliter():按条件进行过滤

limit():按个数进行取出

distinct():去重

skip():跳过前N个流,开始截取

map():对集合元素逐个进行函数操作,映射成全新的一个集合

flatmap():接收一个函数作为参数,将流中的值进行函数操作后,然后把所有流连接成一个流

sorted():排序,可自定义排序

Collectors.groupingBy:按条件进行分组

查找匹配

reduce():将流中的数据反复结合起来得到一个值

终止操作

查找与匹配

归约

Collector 接口中方法


什么是Stream流

在《java8 in action》书中,作者说目前我们在几乎所有开发中都会用到集合,但是目前集合在程序开发中的表现还不够完美,比如你利用集合处理大量数据时,你不得不面对性能问题,不得不考虑进行并行代码的编写,这些工作都是比较繁重的,于是作者便创造了Stream 流。相比较Collection集合来说,Stream在开发中就具有许多独特的优点。

  • 以声明式的方式处理数据集合——更简洁,更易读
  • 可复合——更灵活
  • 可并行——无需写任何多线程代码,Stream API自动处理这些问题,性能更好

注意:map是无法使用stream流,可以将key-value单独取出来做流处理


创建Stream流

有三种方式创建流,静态方法,集合流(常用),数组流。

        //静态方法Stream.of("start",1,2,3,"end");//集合流ArrayList<Object> arrayList = new ArrayList<>();arrayList.stream();//数组流int[] ints = new int[5];Arrays.stream(ints);

使用Stream流(常用API)

首先创建一个Student类测试

public class Student {private String name;public Student(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +'}';}
}
  List<Employee> employeeList = Arrays.asList(new Employee(101,"杰斯",29,10000.02),new Employee(101,"杰斯",29,20000.02),new Employee(102,"莫甘娜",19,500.02),new Employee(103,"剑姬",31,4399.02),new Employee(104,"刀妹",25,7777.02),new Employee(105,"提莫",44,100.02));

fliter():按条件进行过滤

employeeList
.stream()
.filter(x->x.getAge()>20)
.forEach(System.out::println);

取出年龄大于20岁的结果

------------按条件过滤-------------
Employee{id=101, name='杰斯', age=29, salary=10000.02}
Employee{id=101, name='杰斯', age=29, salary=20000.02}
Employee{id=103, name='剑姬', age=31, salary=4399.02}
Employee{id=104, name='刀妹', age=25, salary=7777.02}
Employee{id=105, name='提莫', age=44, salary=100.02}

limit():按个数进行取出

employeeList
.stream()
.limit(2)
.forEach(System.out::println);

取出前两个结果

-------------选择前几个输出------------
Employee{id=101, name='杰斯', age=29, salary=10000.02}
Employee{id=101, name='杰斯', age=29, salary=20000.02}

distinct():去重

employeeList
.stream()
.distinct()
.forEach(System.out::println);

skip():跳过前N个流,开始截取

 employeeList
.stream()
.skip(4)
.forEach(System.out::println);

跳过前4个流

--------------跳过前4个流,取后面的流-----------
Employee{id=104, name='刀妹', age=25, salary=7777.02}
Employee{id=105, name='提莫', age=44, salary=100.02}

map():对集合元素逐个进行函数操作,映射成全新的一个集合

employeeList
.stream()
.map(x->x.getSalary()+10000) //将工资都加10000
.forEach(System.out::println);

------------map(接受lambda,将一个函数作为参数,应用到每个元素上,输出新的流)---------
20000.02
30000.02
10500.02
14399.02
17777.02
10100.02

flatmap():接收一个函数作为参数,将流中的值进行函数操作后,然后把所有流连接成一个流

        System.out.println("--------------flatmap(连接)-----------");List<String> list = Arrays.asList("hello", "word");System.out.println(list);        //[hello, word]List<Object> collect1 = list.stream().map(x -> x.split("")).flatMap(Arrays::stream).collect(Collectors.toList());System.out.println(collect1);    //[h, e, l, l, o, w, o, r, d]

如果不加flatmap,会输出[ [h,e,l,l,o] [w,o,r,d] ] 两个流,flatmap就是将这两个数组流合并成了一个流

sorted():排序,可自定义排序

                 employeeList.stream().sorted((x,y) ->{if (x.getAge().equals(y.getAge())) {return x.getSalary().compareTo(y.getSalary());}else {return x.getAge().compareTo(y.getAge());}}).forEach(System.out::println);

--------------排序(自定义排序)-----------
Employee{id=102, name='莫甘娜', age=19, salary=500.02}
Employee{id=104, name='刀妹', age=25, salary=7777.02}
Employee{id=101, name='杰斯', age=29, salary=10000.02}
Employee{id=101, name='杰斯', age=29, salary=20000.02}
Employee{id=103, name='剑姬', age=31, salary=4399.02}
Employee{id=105, name='提莫', age=44, salary=100.02}

先按年龄排队,再按工资排队

Collectors.groupingBy:按条件进行分组

Map<Boolean, List<Employee>> collect1 = employeeList
.stream()
.collect(Collectors.groupingBy(x -> x.getAge() > 20));

{false=[Employee{id=102, name='莫甘娜', age=19, salary=500.02}],

true=[Employee{id=101, name='杰斯', age=29, salary=10000.02},

Employee{id=101, name='杰斯', age=29, salary=20000.02},

Employee{id=103, name='剑姬', age=31, salary=4399.02},

Employee{id=104, name='刀妹', age=25, salary=7777.02},

Employee{id=105, name='提莫', age=44, salary=100.02}]}

查找匹配

        employeeList.stream().anyMatch(x->x.getAge()==29);employeeList.stream().allMatch(x->x.getAge()==29);employeeList.stream().noneMatch(x->x.getAge()==29);employeeList.stream().findFirst();employeeList.stream().findAny();employeeList.stream().count();employeeList.stream().max((x, y) -> x.getAge().compareTo(y.getAge()));employeeList.stream().min(Comparator.comparing(Employee::getAge));

reduce():将流中的数据反复结合起来得到一个值

        //设置初始值List<Integer> list = Arrays.asList(1, 2, 3);System.out.println(list.stream().reduce(100, (x, y) -> x * y));//不设置初始值List<Integer> list = Arrays.asList(2, 2, 3);System.out.println(list.stream().reduce( (x, y) -> x * y));

600

12


终止操作

会中止流操作,返回结果的函数

查找与匹配

allMatch(Predicate p)  检查是否匹配所有元素
anyMatch(Predicate ) 检查是否至少匹配一个元素
noneMatch(Predicate p)   检查是否没有匹配所有元素
findFirst() 返回第一个元素
findAny() 返回当前流中的任意元素
count()  返回流中元素总数
max(Comparator c) 返回流中最大值
min(Comparator c)   返回流中最小值
forEach(Consumer c)  stream API 使用内部迭代

归约

reduce () 将流中元素反复结合起来,得到一个值。

Collector 接口中方法

Collector 接口中方法的实现决定了如何对流执行收集操作(如收集到 List、Set、Map)。但是 Collectors 实用类提供了很多静态方法,可以方便地创建常见收集器实例.

【Java8新特性】Stream流相关推荐

  1. Java8新特性Stream流详解

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

  2. java8新特性stream流

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

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

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

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

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

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

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

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

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

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

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

  8. Java8新特性 Stream流常用方法

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

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

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

  10. java8新特性-Stream流

    直接贴代码: package com.c8a.stream;import lombok.AllArgsConstructor; import lombok.Data; import lombok.No ...

最新文章

  1. kwargs.pop是什么意思
  2. Scrum看板工具Leangoo敏捷企业实践分享
  3. 中国计算机专业专科学校排名2015,计算机专科学校排名前十(最出名的10所计算机学院)...
  4. WebDAV服务漏洞利用工具DAVTest
  5. 欧洲安全研究人员:黑客是如何泄露加密电子邮件
  6. 工业互联网企业如何做,才能“赋能万物,连接未来”?
  7. FreeMarker标签与使用
  8. vscode生成vue模板快捷键_vs code 快速生成vue 模板
  9. 解决:(1062, Duplicate entry '2019-08-30' for key 'rdate')
  10. [Java] 蓝桥杯ADV-213 算法提高 3-2求存款
  11. HTK搭建大词汇量连续语音识别系统(三)
  12. 我查查 6.6 去校验分析
  13. html5 苹果 风格,[网页设计]8个超炫酷仿苹果应用的HTML5动画
  14. 区块链跨链技术之BTC Relay
  15. php获取指定日期的节假日信息
  16. 综合Synthesis
  17. 【GD32F310开发板试用】编码器接口的使用
  18. c语言字符图形的操作叙述,C语言课程设计--(图形编程_全).doc
  19. 【总结】4S汽车维修管理系统ssm框架vuejs项目
  20. ibox (bootstrap)

热门文章

  1. 杂谈---一个项目经理的自我反省
  2. web服务器基于那个协议,网页浏览服务基于什么协议 Web服务器是基于什么协议...
  3. Widows Server 2012上无法安装.net framework 3.5
  4. filtering_audio.c/filtering_video.c 解读
  5. DS树--找出直系亲属
  6. python电影爬虫背景介绍_Python爬虫入门教程01之爬取豆瓣Top电影
  7. 求一个n阶矩阵的转置矩阵
  8. 如何用windows7搭建radius服务器
  9. 项目日历是什么?如何规划?
  10. ARPG、MMORPG、MOBA、卡牌类、棋盘类游戏服务器架构图