深入 java8 第 07 篇 ( Stream API 的操作->规约,收集 )

一、Stream API 的操作步骤:

创建 Stream

中间操作

终止操作(终端操作 -> 规约,收集)

7.1 规约

reduce(T iden, BinaryOperator b) 可以将流中元素反复结合起来,得到一个值。 返回 T

reduce(BinaryOperator b) 可以将流中元素反复结合起来,得到一个值。 返回 Optional

7.1.1 准备测试数据

List emps = Arrays.asList(

new Employee(001, "Emma", 41, 20000, Status.FREE),

new Employee(002, "Mary", 39, 18000, Status.BUSY),

new Employee(003, "Allen", 33, 15000, Status.BUSY),

new Employee(004, "Olivia", 52, 32000, Status.FREE),

new Employee(005, "Natasha", 27, 13000, Status.BUSY),

new Employee(006, "Kevin", 25, 10000, Status.FREE),

new Employee(007, "Haivent", 25, 12000, Status.FREE)

);

List numList = Arrays.asList(1,2,3,4,5,6,7,8,9,10);

7.1.2 测试规约

@Test

public void test01(){

// 所有整数累加和

Integer reduce = numList.stream()

.reduce(0, (x,y)->x+y); System.out.println(reduce); // 所有薪资累加和 Optional reduce2 = emps.stream() .map(Employee::getSalary) .reduce(Double::sum); System.out.println("\n"+reduce2.get()); }

7.1.3 需求:统计所有姓名中 “A” 的出现次数

@Test

public void test02(){

Optional reduce = emps.stream()

.map(Employee::getName)

.flatMap(StreamAPI03::filterCharacter)

.map((e)->{ if(e.equals('A')){ return 1; }else{ return 0; } }) .reduce(Integer::sum); System.out.println(reduce.get()); } private static Stream filterCharacter(String str){ List list = new ArrayList<>(); for (Character ch : str.toCharArray()) { list.add(ch); } return list.stream(); }

7.2 收集

collect(Collector c) 将流转换为其他形式。接收一个 Collector接口的实现,用于给Stream中元素做汇总的方法。

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

方法与实例:

toList

List 把流中元素收集到List

toSet

Set 把流中元素收集到Set

toCollection

Collection 把流中元素收集到创建的集合

counting

Long 计算流中元素的个数

summingInt

Integer 对流中元素的整数属性求和

averagingInt

Double 计算流中元素Integer属性的平均值

summarizingInt

IntSummaryStatistics 收集流中Integer属性的统计值。如:平均值

joining

String 连接流中每个字符串

maxBy

Optional 根据比较器选择最大值

minBy

Optional 根据比较器选择最小值

reducing

归约产生的类型 从一个作为累加器的初始值开始,利用BinaryOperator与流中元素逐个结合,从而归约成单个值

collectingAndThen

转换函数返回的类型 包裹另一个收集器,对其结果转换函数

groupingBy

Map> 根据某属性值对流分组,属性为K,结果为V

partitioningBy

Map> 根据true或false进行分区

7.2.1 测试收集 收集到集合

@Test

public void test03(){

List collect = emps.stream()

.map(Employee::getName)

.collect(Collectors.toList());

collect.forEach(System.out::println);

System.out.println();

Set collect2 = emps.stream()

.map(Employee::getName)

.collect(Collectors.toSet());

collect2.forEach(System.out::println);

System.out.println();

ArrayList collect3 = emps.stream()

.map(Employee::getName)

.collect(Collectors.toCollection(ArrayList::new));

collect3.forEach(System.out::println);

}

7.2.3 对流中元素进行计算

@Test

public void test04(){

Long collect = emps.stream()

.collect(Collectors.counting());

System.out.println("总员工数:"+collect);

Double collect2 = emps.stream()

.collect(Collectors.summingDouble(Employee::getSalary));

System.out.println("\n每月应发薪资总额:"+collect2);

Double collect3 = emps.stream()

.collect(Collectors.averagingDouble(Employee::getSalary));

System.out.println("\n员工平均月薪:"+collect3);

DoubleSummaryStatistics collect4 = emps.stream()

.collect(Collectors.summarizingDouble(Employee::getSalary));

System.out.println("\n员工中最低薪资为:"+collect4.getMin());

Optional collect5 = emps.stream()

.map(Employee::getSalary)

.collect(Collectors.maxBy(Double::compare));

System.out.println("\n员工中薪资最高为:"+collect5.get());

Optional collect6 = emps.stream()

.map(Employee::getSalary)

.collect(Collectors.minBy(Double::compare));

System.out.println("\n员工中薪资最低为:"+collect6.get());

Optional collect7 = emps.stream()

.map(Employee::getSalary)

.collect(Collectors.reducing(Double::sum));

System.out.println("\n员工每月薪资总共为:"+collect7.get());

}

7.2.4 将多个字符串连接成一个字符串

@Test

public void test05(){

String collect = emps.stream()

.map(Employee::getName)

.collect(Collectors.joining("-"));

System.out.println(collect);

}

7.2.5 对类型转换为集合后,返回集合大小

@Test

public void test06(){

Integer collect = emps.stream()

.collect(Collectors.collectingAndThen(Collectors.toList(), List::size));

System.out.println(collect);

}

7.2.6 单级分组

@Test

public void test07(){

Map> collect = emps.stream()

.collect(Collectors.groupingBy(Employee::getStatus));

System.out.println(collect);

}

7.2.7 多级分组

@Test

public void test08(){

Map>> collect = emps.stream()

.collect(Collectors.groupingBy((e)->{ if(e.getStatus() == Status.FREE){ return "空闲"; }else{ return "繁忙"; } }, Collectors.groupingBy((e)->{ if(e.getSalary() > 10000){ return "大于 15000"; }else if (e.getSalary() > 20000){ return "大于 20000"; }else{ return "大于25000"; } }))); System.out.println(collect); }

根据员工状态进行分区

@Test

public void test09(){

Map> collect = emps.stream()

.collect(Collectors.partitioningBy((e)->e.getStatus() == Status.FREE)); System.out.println(collect); }

java规约运算的signature_Java8笔记第七篇(Stream API 的操作-规约,收集 )相关推荐

  1. Java笔记第七篇 数据类型初了解(下,后含有循环输出a-z)

    #日常唠叨1#怎么这么久没有更新?因为小星星的学校在没有提前通知的情况下开展了军训,没有时间打博客.现在已经是9月1日之后了,决定每周日更新,一周一更 #日常唠叨2#有人问知道这些数据类型有什么用?嘻 ...

  2. Java并发编程的艺术笔记(七)——CountDownLatch、CyclicBarrier详解

    一.等待多线程完成的CountDownLatch CountDownLatch允许一个或多个线程等待其他线程完成操作,像加强版的join.(t.join()是等待t线程完成) 例: (1)开启多个线程 ...

  3. java 流式_Java开发笔记(七十二)Java8新增的流式处理

    通过前面几篇文章的学习,大家应能掌握几种容器类型的常见用法,对于简单的增删改和遍历操作,各容器实例都提供了相应的处理方法,对于实际开发中频繁使用的清单List,还能利用Arrays工具的asList方 ...

  4. 黑马程序员——Java String类 and 正则表达式(第七篇)

    -----------android培训.java培训.java学习型技术博客.期待与您交流!------------ 虽然老毕视频中把正则表达式放到了最后面才讲,但个人认为他和String功能上有些 ...

  5. Java菜鸟教程系列 学习笔记总结 基础篇(1)

    基础语法 本博客通过学习菜鸟教程Java专栏,并整理得出的Java基础知识. 命名规范 1.项目名全部小写 2.包名全部小写 3.类名首字母大写,如果类名由多个单词组成,每个单词的首字母都要大写.如: ...

  6. Java快速教程--vamei 学习笔记(基础篇)

    链接:http://www.cnblogs.com/vamei/archive/2013/03/31/2991531.html java快速教程第1课 从HelloWorld到面向对象 学习网址:ht ...

  7. Nodejs学习笔记(七)——接口API

    [目录] Nodejs学习笔记(一)--基础之全局对象.包和npm Nodejs学习笔记(二)--模块 Nodejs学习笔记(三)--同步和与异步之文件系统模块 Nodejs学习笔记(四)--http ...

  8. 清掉数据_学习之大数据项目笔记第七篇【数仓模块-日志预处理篇】

    1 需求说明 1.1 清洗过滤 1)去除json数据体中的废弃字段(这是前端开发人员在埋点设计方案变更后遗留的无用字段): "email" "phoneNbr" ...

  9. python目录和文件的基本操作_python学习笔记(七)——文件和目录操作

    目录和文件操作 语言只有和外部连起来操作才会实现更强大的功能,比如操作文件.数据库等,这样数据可以有一块单独存储的地方,而不是存放在内存中.更强大的是网络编程,当然这些后续都会学习.接下来学习pyth ...

最新文章

  1. 十九、I2C驱动及应用
  2. Coursera公开课笔记: 斯坦福大学机器学习第六课“逻辑回归(Logistic Regression)”
  3. android开发地址选择器,Android地址选择器 类似于京东的地址选择
  4. ZED 相机 ORB-SLAM2安装环境配置与ROS下的调试
  5. I see IC的破冰之旅
  6. ubuntu双系统把win7设置为默认启动选项
  7. nodeJs 控制台打印中文显示为Unicode解决方案
  8. 静态html如何写入文件,静态HTML模板渲染
  9. oracle服务器配置及优化
  10. c# gerber文件读取_gerber大文本文件打开工具|gerber文件打开工具(gerbview) v7.71 免费版 - 软件下载 - 绿茶软件园|33LC.com...
  11. Sybase数据库整体迁移纪要
  12. 【谈谈疫情+金三银四下测试面试的行情】一个月内连续面试40+位候选人。
  13. 算法题 金银铜奖牌排序
  14. python怎么画人像_教你如何用Python画出心目中的自己
  15. Hot 100(三)
  16. win7 vs2013 编译错误
  17. 直击|人人车回应“破产”传闻:消息不实
  18. 录屏程序之屏幕实时录制保存成AVI视频文件
  19. QQ、微信、新浪微博和百度第三方登录
  20. Java随机生成大乐透号码

热门文章

  1. Django-查到晕
  2. 前端使用print.js实现打印
  3. 上下Div固定,中间div高度自适应(随浏览器高度变化而变化)
  4. 雒怎么读「知识普及」
  5. 专属于你的微信好友报告(词云、数据可视化,完整代码提供)
  6. MemoryError的处理方式
  7. 【科普一下】量子力学史上的四次大论战
  8. Chatgpt频繁“something went wrong”需要刷新的解决办法
  9. 中医说:得了普通感冒,为啥七天自愈
  10. Vue2 中 .env.development .env.production 详细说明