Collectors常用方法

工厂方法 返回类型 作用
toSet Set 把流中所有项目收集到一个 Set,删除重复项
toList List 收集到一个 List 集合中
toCollection Collection 把流中所有项目收集到给定的供应源创建的集合menuStream.collect(toCollection(), ArrayList::new)
counting Long 计算流中元素的个数
summingInt Integer 对流中项目的一个整数属性求和
averagingInt Double 计算流中项目 Integer 属性的平均值
summarizingInt IntSummaryStatistics 收集关于流中项目 Integer 属性的统计值,例如最大、最小、 总和与平均值
joining String 连接对流中每个项目调用 toString 方法所生成的字符串collect(joining(", "))
maxBy Optional 一个包裹了流中按照给定比较器选出的最大元素的 Optional, 或如果流为空则为 Optional.empty()
minBy Optional 一个包裹了流中按照给定比较器选出的最小元素的 Optional, 或如果流为空则为 Optional.empty()
reducing 归约操作产生的类型 从一个作为累加器的初始值开始,利用 BinaryOperator 与流 中的元素逐个结合,从而将流归约为单个值累加int totalCalories = menuStream.collect(reducing(0, Dish::getCalories, Integer::sum));
collectingAndThen 转换函数返回的类型 包裹另一个收集器,对其结果应用转换函数int howManyDishes = menuStream.collect(collectingAndThen(toList(), List::size))
groupingBy Map<K, List> 根据项目的一个属性的值对流中的项目作问组,并将属性值作 为结果 Map 的键
partitioningBy Map<Boolean,List> 根据对流中每个项目应用谓词的结果来对项目进行分区

示例

Apple 类

public class Apple {
private Integer id;
private String name;
private Integer num;
private String color; public Apple() {} public Apple(Integer id, String name, Integer num, String color) {
this.id = id;
this.name = name;
this.num = num;
this.color = color;
} // 省略 setter、getter方法 @Override
public String toString() {
return "Apple{" +
"id=" + id +
", name='" + name + '\'' +
", num=" + num +
", color='" + color + '\'' +
'}';
}
}

数据

List<Apple> appleList = new ArrayList<>();

Apple apple1 =  new Apple(1,"苹果1",10, "red");
Apple apple2 = new Apple(1,"苹果2",20, "green");
Apple apple3 = new Apple(2,"香蕉",30, "yellow");
Apple apple4 = new Apple(3,"荔枝",40, "red"); appleList.add(apple1);
appleList.add(apple2);
appleList.add(apple3);
appleList.add(apple4);

常用收集器示例

  • toList
// 获取数量大于25的Apple
List<Apple> collect = appleList.stream()
.filter(apple -> apple.getNum() > 25)
.collect(toList());
//
[Apple{id=2, name='香蕉', num=30, color='yellow'},
Apple{id=3, name='荔枝', num=40, color='red'}]
  • toSet
// 获取颜色信息
Set<String> collect = appleList.stream()
.map(Apple::getColor)
.collect(toSet());
// [red, green, yellow]
  • toCollection
List<Apple> collect = appleList.stream()
.filter(x->x.getNum()>18)
.collect(toCollection(ArrayList::new));
/-----------------------------/
[Apple{id=1, name='苹果2', num=20, color='green'},
Apple{id=2, name='香蕉', num=30, color='yellow'},
Apple{id=3, name='荔枝', num=40, color='red'}]
  • counting:统计数量
Long aLong = appleList.stream()
.filter(x -> x.getNum() > 18)
.collect(counting());
// 另一种写法
Long aLong = appleList.stream()
.filter(x -> x.getNum() > 18)
.count();
// 3
  • summingInt:对一个属性求和
Integer integer = appleList.stream()
.collect(summingInt(p -> p.getNum()));
// 另一种写法
Integer integer = appleList.stream()
.mapToInt(Apple::getNum).sum();
// 100
  • averagingInt:求平均值
Double aDouble = appleList.stream().collect(averagingInt(Apple::getNum));
// 25.0
  • summarizingInt:求最大、最小、平均值等
IntSummaryStatistics collect1 = appleList.stream().collect(summarizingInt(Apple::getNum));
// IntSummaryStatistics{count=4, sum=100, min=10, average=25.000000, max=40}
  • joining:对流中元素调用toString,拼接成字符串
String s = appleList.stream().map(Apple::getName).collect(joining("--"));
// 苹果1--苹果2--香蕉--荔枝
  • maxBy | minBy : 求最大最小元素
Optional<Apple> collect = appleList.stream()
.collect(maxBy(comparing(Apple::getNum)));
// 另一种写法
Optional<Apple> collect = appleList.stream()
.max(comparing(Apple::getNum))
// Apple{id=3, name='荔枝', num=40, color='red'}
  • reducing:规约操作
Integer integer = appleList.stream()
.collect(reducing(0, Apple::getNum, Integer::sum));
// 另一种写法
Optional<Integer> reduce = appleList.stream()
.map(Apple::getNum)
.reduce(Integer::sum);
// 100
  • groupingBy | partitioningBy :分组操作
Map<Integer, List<Apple>> groupBy = appleList.stream()
.collect(Collectors.groupingBy(Apple::getId));
// {
1=[Apple{id=1, name='苹果1', num=10, color='red'},
Apple{id=1, name='苹果2', num=20, color='green'}],
2=[Apple{id=2, name='香蕉', num=30, color='yellow'}],
3=[Apple{id=3, name='荔枝', num=40, color='red'}]} // partitioningBy:条件分组
Map<Boolean, List<Apple>> collect1 = appleList.stream()
.collect(partitioningBy(x -> x.getNum() > 24));
// {
false=[Apple{id=1, name='苹果1', num=10, color='red'},
Apple{id=1, name='苹果2', num=20, color='green'}],
true=[Apple{id=2, name='香蕉', num=30, color='yellow'},
Apple{id=3, name='荔枝', num=40, color='red'}]}

Lambda收集器示例的更多相关文章

  1. Java基础学习总结(44)——10个Java 8 Lambda表达式经典示例

    Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表达式,它将允许我们将行为传到函数里.在Ja ...

  2. 2020了你还不会Java8新特性?(五)收集器比较器用法详解及源码剖析

    收集器用法详解与多级分组和分区 为什么在collectors类中定义一个静态内部类? static class CollectorImpl<T, A, R> implements Coll ...

  3. G1收集器-原创译文[未完成]

    G1收集器-原创译文 原文地址 Getting Started with the G1 Garbage Collector 目的 本文介绍了如何使用G1垃圾收集器以及如何与Hotspot JVM一起使 ...

  4. [一] java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念

      本文是针对于java8引入函数式编程概念以及stream流相关的一些简单介绍 什么是函数式编程?   java程序员第一反应可能会理解成类的成员方法一类的东西 此处并不是这个含义,更接近是数学上的 ...

  5. [四] java8 函数式编程 收集器浅析 收集器Collector常用方法 运行原理 内部实现

    Collector常见用法     常用形式为:   .collect(Collectors.toList()) collect()是Stream的方法 Collectors  是收集器Collect ...

  6. 垃圾收集器之:G1收集器

    G1垃圾收集器是一种工作在堆内不同分区上的并发收集器.分区既可以归属于老年代,也可以归属新生代,同一个代的分区不需要保持连续.为老年代设计分区的初衷是我们发现并发后台线程在回收老年代中没有引用的对象时 ...

  7. 垃圾收集器之:CMS收集器

    HotSpot JVM的并发标记清理收集器(CMS收集器)的主要目标就是:低应用停顿时间.该目标对于大多数交互式应用很重要,比如web应用.在我们看一下有关JVM的参数之前,让我们简要回顾CMS收集器 ...

  8. 垃圾收集器之:throughput吞吐量收集器

    在实践中我们发现对于大多数的应用领域,评估一个垃圾收集(GC)算法如何根据如下两个标准: 吞吐量越高算法越好 暂停时间越短算法越好 首先让我们来明确垃圾收集(GC)中的两个术语:吞吐量(through ...

  9. Stream01 定义、迭代、操作、惰性求值、创建流、并行流、收集器、stream运行机制

    1 Stream Stream 是 Java 8 提供的一系列对可迭代元素处理的优化方案,使用 Stream 可以大大减少代码量,提高代码的可读性并且使代码更易并行. 2 迭代 2.1 需求 随机创建 ...

随机推荐

  1. 第2天:JavaScript基础(运算符、案例、循环、冒泡以及prompt提示输入框)

    一元运算在前在后的区别 加加 var num1 = 10; //++在后面 先参与运算 再自加1 var sum1 = num1++ +10; console.log("sum1的值:&qu ...

  2. CSS实现响应式布局(自动拆分几列)

    1.css代码 <style type="text/css"> .container{ margin-top: 10px; } .outerDiv{ float:lef ...

  3. Nginx 502错误总结

    http请求流程:一般情况下,提交动态请求的时候,nginx会直接把 请求转交给php-fpm,而php-fpm再分配php-cgi进程来处理相关的请求,之后再依次返回,最后由nginx把结果反馈给客 ...

  4. COGS2216 你猜是不是KMP

    第一道自己写的FFT...... 不知为啥这题在网上找不到题解......真是麻烦,害得我推了半天...... 还是写个简要题解吧...... 首先把S和T拆成序列,a~z分别对应成1~26,?是0, ...

  5. 11.6NOIP模拟赛解题报告

    心路历程 预计得分:\(100 + 100 + 100 = 300\) 实际得分:\(100 +100 +100 = 300\) 学OI两年终于AK了一次qwq(虽然题目炒鸡水..) 纪念一下这令人激 ...

  6. 申请微信小程序步骤

    一.注册 注册网址:https://mp.weixin.qq.com/ 选择账号类型:选择 小程序 注册账号 填写邮箱密码并激活:未注册过公众平台.开放平台.企业号.未绑定个人号的邮箱. 填写主体信息 ...

  7. Windows API 编程-----DLL编程之禁止加载自己

    和可执行文件一样,动态链接库也有自己的入口地址,如果系统或者当前进程的某个线程调用LoadLibrary函数加载或者使用FreeLibrary卸载该动态链接库的时候,会自动使用3个特定的堆栈参数跳转到 ...

  8. 通过JavaScript创建Qml对象

    有两种方法可以创建,都是全局对象Qt提供的方法 一:用Qt.createComponent加载一个qml文件并创建Component 二:用Qt.createQmlObject从一个qml字符串创建C ...

  9. 面试题Spring Boot

    Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一名 Spring Boot 的专家. 问题一 Spring Boot.Spring MVC 和 Spring 有什么区别 ...

  10. SQL Server ->> Database Promgramming Object Security Control(数据库编程对象安全控制)

    对于SQL Server内编程对象的安全控制是今天我在思考的问题.在MSDN上找到了几篇有用的文章. 首先微软推荐了三种做法: 1)第一种做法是在SQL Server中对一个应用程序对应创建应用程序角 ...