java8 stream接口 终端操作 collect操作

java 8 lambda 专栏收录该内容
1 篇文章 0 订阅

java8 stream接口 终端操作 collect操作

java8 stream接口 终端操作 collect操作

链接:
转载自葵花下的獾:https://blog.csdn.net/qq_28410283/article/details/81052881






在之前,我们有说到,java8中的stream操作,分为中间操作和终端操作,在终端操作中,前面也看到了归约的方式,这篇主要是也说的归约操作的方式collect,收集器操作,收集器操作,可以当做是一种更高级的归约操作;

先看下stream中的collect操作


 
  1. <R> R collect(Supplier <R> supplier,BiConsumer <R, ? super T> accumulator,BiConsumer <R, R> combiner);
  2. <R, A> R collect(Collector <? super T, A, R> collector);

 

第一个,是传入3个参数的抽象方法,

第二个只有一个参数的先看下stream中的collect操作Collectors静态工厂类,而在这个静态工厂类中,大部分的实现,都是调用的三个参数的方法,几乎满足了我们日常中所有的操作;所以说,我们只看下,这个静态工厂类中,有哪些实现;

在java8实战中,有列举出来,大家可以自己看下介绍,下面,我们通过代码,做个演示;


 
  1. package com.badger;
  2. import java.util.ArrayList;
  3. import java.util.IntSummaryStatistics;
  4. import java.util.List;
  5. import java.util.Map;
  6. import java.util.Optional;
  7. import java.util.Set;
  8. import java.util.function.Function;
  9. import java.util.stream.Collectors;
  10. import org.junit.Test;
  11. public class TestJava8 {
  12. public static List<Emp> list = new ArrayList<>();
  13. static {
  14. list.add( new Emp( "上海", "小名", 17));
  15. list.add( new Emp( "北京", "小红", 18));
  16. list.add( new Emp( "深圳", "小蓝", 19));
  17. list.add( new Emp( "广州", "小灰", 20));
  18. list.add( new Emp( "杭州", "小黄", 21));
  19. list.add( new Emp( "贵阳", "小白", 22));
  20. }
  21. @ Test
  22. public void test1 () {
  23. // 转list
  24. List<String> names = list.stream(). map(emp -> emp.getName()).collect(Collectors.toList());
  25. // 转set
  26. Set<String> address = list.stream(). map(emp -> emp.getName()).collect(Collectors.toSet());
  27. // 转map,需要指定key和value,Function.identity()表示当前的Emp对象本身
  28. Map<String, Emp> map = list.stream().collect(Collectors.toMap(Emp::getName, Function.identity()));
  29. // 计算元素中的个数
  30. Long count = list.stream().collect(Collectors.counting());
  31. // 数据求和 summingInt summingLong,summingDouble
  32. Integer sumAges = list.stream().collect(Collectors.summingInt(Emp::getAge));
  33. // 平均值 averagingInt,averagingDouble,averagingLong
  34. Double aveAges = list.stream().collect(Collectors.averagingInt(Emp::getAge));
  35. // 综合处理的,求最大值,最小值,平均值,求和操作
  36. // summarizingInt,summarizingLong,summarizingDouble
  37. IntSummaryStatistics intSummary = list.stream().collect(Collectors.summarizingInt(Emp::getAge));
  38. System.out.println(intSummary.getAverage()); // 19.5
  39. System.out.println(intSummary.getMax()); // 22
  40. System.out.println(intSummary.getMin()); // 17
  41. System.out.println(intSummary.getSum()); // 117
  42. // 连接字符串,当然也可以使用重载的方法,加上一些前缀,后缀和中间分隔符
  43. String strEmp = list.stream(). map(emp -> emp.getName()).collect(Collectors.joining());
  44. String strEmp1 = list.stream(). map(emp -> emp.getName()).collect(Collectors.joining( "-中间的分隔符-"));
  45. String strEmp2 = list.stream(). map(emp -> emp.getName()).collect(Collectors.joining( "-中间的分隔符-", "前缀*", "&后缀"));
  46. System.out.println(strEmp); // 小名小红小蓝小灰小黄小白
  47. // 小名-中间的分隔符-小红-中间的分隔符-小蓝-中间的分隔符-小灰-中间的分隔符-小黄-中间的分隔符-小白
  48. System.out.println(strEmp1);
  49. // 前缀*小名-中间的分隔符-小红-中间的分隔符-小蓝-中间的分隔符-小灰-中间的分隔符-小黄-中间的分隔符-小白&后缀
  50. System.out.println(strEmp2);
  51. // maxBy 按照比较器中的比较结果刷选 最大值
  52. Optional<Integer> maxAge = list.stream(). map(emp -> emp.getAge()).collect(Collectors.maxBy(Integer::max));
  53. // 最小值
  54. Optional<Integer> minAge = list.stream(). map(emp -> emp.getAge()).collect(Collectors.minBy(Integer::min));
  55. // 归约操作
  56. list.stream(). map(emp -> emp.getAge()).collect(Collectors.reducing((x, y) -> x + y));
  57. list.stream(). map(emp -> emp.getAge()).collect(Collectors.reducing( 0, (x, y) -> x + y));
  58. // 分操作 groupingBy 根据地址,把原list进行分组
  59. Map<String, List<Emp>> mapGroup = list.stream().collect(Collectors.groupingBy(Emp::getAddress));
  60. // partitioningBy 分区操作 需要根据类型指定判断分区
  61. Map<Boolean, List<Integer>> partitioningMap = list.stream(). map(emp -> emp.getAge())
  62. .collect(Collectors.partitioningBy(emp -> emp > 20));
  63. }
  64. static class Emp {
  65. private String address;
  66. private String name;
  67. private Integer age;
  68. public Emp() {
  69. }
  70. public Emp(String address) {
  71. this.address = address;
  72. }
  73. public Emp(String name, Integer age) {
  74. this.name = name;
  75. this.age = age;
  76. }
  77. public Emp(String address, String name, Integer age) {
  78. super();
  79. this.address = address;
  80. this.name = name;
  81. this.age = age;
  82. }
  83. public String getAddress() {
  84. return address;
  85. }
  86. public void setAddress(String address) {
  87. this.address = address;
  88. }
  89. public String getName() {
  90. return name;
  91. }
  92. public void setName(String name) {
  93. this.name = name;
  94. }
  95. public Integer getAge() {
  96. return age;
  97. }
  98. public void setAge(Integer age) {
  99. this.age = age;
  100. }
  101. @ Override
  102. public String toString () {
  103. return "Emp [address=" + address + ", name=" + name + ", age=" + age + "]";
  104. }
  105. }
  106. }

先介绍在这里,大家对java8的的函数式接口,以及lambda表达式的写法,有看不懂的,可以参看我之前的文章

1.lambda表达式

《java8 Lambda表达式简介》

《java8 lambda表达式,方法的引用以及构造器的引用》

2.函数式接口

《java8 函数式接口简介》

《JAVA8 Function接口以及同类型的特化的接口》

《JAVA8 Consumer接口》

《JAVA8 Supplier接口》

《JAVA8 UnaryOperator接口》

《JAVA8 BiConsumer 接口》

3.stream接口操作

《java8 Stream接口简介》

《 java8 Stream-创建流的几种方式》

《JAVA8 stream接口 中间操作和终端操作》

《JAVA8 Stream接口,map操作,filter操作,flatMap操作》

《JAVA8 stream接口 distinct,sorted,peek,limit,skip》

《java8 stream接口 终端操作 forEachOrdered和forEach》

《java8 stream接口 终端操作 toArray操作》

《java8 stream接口 终端操作 min,max,findFirst,findAny操作》

《java8 stream接口终端操作 count,anyMatch,allMatch,noneMatch》

《java8 srteam接口终端操作reduce操作》

《java8 stream接口 终端操作 collect操作》

4.其他部分

《java8 Optional静态类简介,以及用法》

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值