读Java实战(第二版)笔记04_用流收集数据

Posted lying7

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了读Java实战(第二版)笔记04_用流收集数据相关的知识,希望对你有一定的参考价值。

1. 方便程序员和可读性是头等大事!

1.1. 函数式API设计更易复合和重用

2. 归约和汇总为一个值

2.1. counting()

2.1.1. 计数

2.2. maxBy

2.2.1. 查找流中的最大值

2.3. minBy

2.3.1. 查找流中的最小值

2.4. summingInt

2.4.1. 可接受一个把对象映射为求和所需int的函数,并返回一个收集器

2.5. summingLong

2.5.1. 可接受一个把对象映射为求和所需long的函数,并返回一个收集器

2.6. summingDouble

2.6.1. 可接受一个把对象映射为求和所需double的函数,并返回一个收集器

2.7. 求和

2.8. averagingInt

2.9. averagingLong

2.10. averagingDouble

2.11. 平均值

2.12. summarizing

2.13. summarizingInt

2.13.1. IntSummary Statistics类型

2.14. summarizingLong

2.14.1. LongSummary Statistics类型

2.15. summarizingDouble

2.15.1. DoubleSummaryStatistics类型

2.16. 数出元素的个数,并得到总和、平均值、最大值和最小值

2.17. joining

2.17.1. 连接

2.17.2. 重载版本可以接受元素之间的分界符

2.18. reducing

2.18.1. 归约

2.18.2. 旨在把两个值结合起来生成一个新值,它是一个不可变的归约

2.18.3. 使用泛型?通配符

2.18.3.1. 累加器本身可以是任何类型

2.18.4. 使用允许提供默认值的方法,如orElse或orElseGet来解开Optional中包含的值更为安全

2.19. collect

2.19.1. 适合并行操作

2.19.2. 特别适合表达可变容器上的归约

3. 元素分组

3.1. “桶”

3.2. groupingBy

3.2.1. 传递了一个Function(以方法引用的形式)

3.2.1.1. Function是分类函数

3.2.2. 单参数groupingBy(f)

3.2.2.1. 双参数groupingBy(f, toList())的简便写法

3.2.3. 双参数

3.2.3.1. 第二变量也接受一个Collector类型的参数

3.2.3.2. 过滤谓词挪到了第二个Collector中

3.2.3.3. 第二个收集器可以是任何类型,而不一定是另一个groupingBy

3.3. 多级分组

3.3.1. 由双参数版本的groupingBy工厂方法创建的收集器

4. 元素分区

4.1. 分组的特殊情况

4.1.1. 使用返回一个布尔值的单参数函数的谓词作为分组函数(分区函数)

4.1.2. 保留了分区函数返回true或false的两套流元素列表

4.2. partitioningBy

4.2.1. 可传递第二个收集器

5. 转换为另一种类型

5.1. collectingAndThen

5.2. 要转换的收集器以及转换函数,并返回另一个收集器

6. 收集器接口

6.1.

        public interface Collector<T, A, R> 
            Supplier<A> supplier();
            BiConsumer<A, T> accumulator();
            Function<A, R> finisher();
            BinaryOperator<A> combiner();
            Set<Characteristics> characteristics();
        

6.1.1. 说明

6.1.1.1. T是流中要收集的项目的泛型

6.1.1.2. A是累加器的类型,累加器是在收集过程中用于累积部分结果的对象

6.1.1.3. R是收集操作得到的对象(通常但并不一定是集合)的类型

6.2. supplier方法

6.2.1. 必须返回一个结果为空的Supplier,也就是一个无参数函数,在调用时它会创建一个空的累加器实例,供数据收集过程使用

6.3. accumulator方法

6.3.1. 会返回执行归约操作的函数

6.4. finisher方法

6.4.1. 必须返回在累积过程的最后要调用的一个函数,以便将累加器对象转换为整个集合操作的最终结果

6.4.2. identity函数

6.4.2.1. 恒等函数

6.4.2.2. 一个函数仅仅是返回其输入参数

6.5. combiner方法

6.5.1. 会返回一个供归约操作使用的函数

6.6. characteristics方法

6.6.1. 会返回一个不可变的Characteristics集合

6.6.2. 定义了收集器的行为

6.6.2.1. UNORDERED

6.6.2.1.1. 归约结果不受流中项目的遍历和累积顺序的影响

6.6.2.2. CONCURRENT

6.6.2.2.1. accumulator函数可以从多个线程同时调用,且该收集器可以并行归约流
6.6.2.2.2. 如果收集器没有标为UNORDERED,那它仅在用于无序数据源时才可以并行归约

6.6.2.3. IDENTITY_FINISH

6.6.2.3.1. 表明完成器方法返回的函数是一个恒等函数,可以跳过

6.7. 进行自定义收集而不去实现Collector

6.7.1. collect方法可以接受另外三个函数——supplier、accumulator和combiner,其语义和Collector接口的相应方法返回的函数完全相同

7. Collectors类的静态工厂方法

7.1. import static java.util.stream.Collectors.*;

7.2. toList

7.2.1. 把流中所有的元素收集到一个List中

7.3. mapping

7.3.1. 提供了另一个Collector函数,它接受一个映射函数和另一个Collector函数作为参数

7.3.2. 使用一个映射函数对它们进行转换

7.4. filtering

7.4.1. 接受一个谓词对每一个分组中的元素执行过滤操作

7.5. toCollection

7.5.1. 对于是什么类型有更多的控制

7.6.


以上是关于读Java实战(第二版)笔记04_用流收集数据的主要内容,如果未能解决你的问题,请参考以下文章

读Java实战(第二版)笔记17_反应式编程

读Java实战(第二版)笔记10_函数式编程的技巧

读Java实战(第二版)笔记11_语言特性和类库更新

读Java实战(第二版)笔记09_函数式的思考

读Java实战(第二版)笔记13_Java模块系统

读Java实战(第二版)笔记19_尾声