使用流来收集数据
上一章中我们谈到流的重要特性:
- 流中的元素不是保存在内存中
- 流不能被重复使用
- 流是懒处理数据
- 流操作不能改变流数据源
- 流允许你把操作串联起来,因此一个操作的输出可以作为下一个操作的输入
Stream的 collect() 方法
collect() 方法允许你对流中的元素进行转换和分组来生成一个新的数据结构。有两个不同版本的 collect() 方法。
第一个版本接收以下三个函数作为参数:
- Supplier:该方法创建一个中间数据类型对象。如果你使用串行流,那么该方法被调用一次。如果你使用并行流那么该方法会被调用多次并且每次调用必须生成一个新的对象
- Accumulator:该方法在处理每一个流中元素时被调用,并保存在中间数据结构
- Combiner:该方法在要把两个中间数据结构整合成一个时调用。该方法只会在使用并行流时被调用
Java 通过 Collectors 工厂类提供了一些预定义的收集器。你可以调用以下静态方法来使用这些收集器:
- averagingDouble(),averagingInt(),和 averagingLong():返回一个collector来计算平均值
- groupingBy():返回一个收集器,该收集器允许你使用流中对象的某个属性来对流中数据进行分组。最终得到的对象是一个map,它的key是选择的属性的值,value是一个对象的队列。
- groupingByConcurrent():这和groupingBy()类似但有两个重要区别。一个是在并行处理时它的性能比groupingBy()高,但在串行处理时性能慢。第二个不同点是 groupingByConcurrent() 方法不是一个排序的收集器。lists中的对象不能保证和原始数据流中的对象顺序一致。但是 groupingBy() 收集器却能保证顺序。
- joining():返回一个收集器来把流中的元素拼接成一个字符串。
- partitioningBy():返回一个收集器用来把流中数据基于一个 predicate 结果来分割
- summarizingDouble(),summarizingInt(), 和 summarizingLong():返回的收集器用来计算流中元素的汇总信息。例如调用 summarizingInt() 方法得到的最终值是 IntSummaryStatistics 对象,你可以调用该对象的 getMax(),getMin(), getCount() 等方法得到流中数据的分析信息。
- toMap():该收集器允许你把流中的数据根据传递的两个映射方法转换成一个map,第一个映射方法参数决定map 的key,第二个映射方法参数决定map的value
- toConcurrentMap():这个和toMap()类似,但是是用并行方式处理的。性能在使用并行方法时比较高效。但是得到的map里的对象是无序的。
- toList():该收集器把流中的数据收集保存在一个list中
- toCollection():该收集器允许你把流中的数据保存到一个新的Collection里并返回。该方法接收一个 Supplier 接口的实现用来创建新的collection对象
- maxBy()和minBy():该收集器返回使用传入的 comparator 参数来决定的数据流中的最大值和最小值
- toSet():该收集器把流中的数据收集保存在一个set中
相关推荐
- 常用方法包括 `filter()`、`map()`、`reduce()`、`collect()` 等,可以方便地进行数据过滤、转换和聚合操作。 - 并行流(Parallel Streams)利用多核处理器优势,实现高效的数据处理。 3. **日期和时间 API...
- **Java内存模型(JMM)** - JMM定义了程序中各个变量(包括实例字段、静态字段和构成数组对象的元素)的访问规则,以及在并发环境下变量的存储与读取假设。 - [更多详情参见]...
- **对比分析**:从架构设计、处理模型等方面比较Flink与Spark Streaming的不同之处。 - **适用场景**:指出两者分别适用于哪些具体的场景。 ### 28. 时间语义及Watermark理解 - **时间语义**:解释Flink中事件时间...
Java 8 Streams 是一个强大的新特性,它引入了一种新的编程模型,允许程序员以更简洁、更声明式的方式处理集合数据。Streams API 提供了一种高效且易读的方式来过滤、映射、归约和聚合数据,非常适合大规模数据处理...
**collect**:也称为`map`,用于遍历集合并返回一个新的数组,新数组中的元素是原数组中元素经过指定操作后的结果。例如: ```ruby arr = [1, 2, 3] new_arr = arr.collect { |x| x * 2 } # new_arr 的值为 [2, 4, 6...
在本Java作业中,我们将深入探讨“可选的Java分配-第2部分”这一主题。这个部分可能涉及Java编程中的高级概念,旨在提高学生对语言特性和最佳实践的理解。让我们详细了解一下这部分可能涵盖的知识点。 1. **Java 8...
总结来说,Java 8的流API提供了一种新的编程模型,它将函数式编程的思想融入到传统的面向对象编程中,让处理集合数据更加高效和简洁。结合Lambda表达式和并行处理,开发者可以编写出更加优雅、易于理解和维护的代码...
- **常用流操作**:如`filter()`、`map()`、`reduce()`、`collect()`等,这些方法帮助实现高效的集合处理。 #### MyBatis多参数传递 - **MyBatis多参数**:在MyBatis的Mapper接口中,可以通过@Param注解明确指定...
6. **flatMap()**: 与map类似,但它将每个输入元素映射为零个或多个输出元素。这在需要展开数据或创建更复杂的数据结构时很有用。 7. **count()** 和 **countByKey()**: 分别计算RDD中的元素总数和按键分组后的元素...
1. **管道操作**:Java Streams通过一系列的中间操作(如filter、map、sorted等)和最终操作(如collect、count、findFirst等)形成一个数据处理的管道。这种流水线式的处理方式使得代码更加简洁和模块化。 2. **...
8. **代码优化**:避免在循环中创建新的RDD,使用mapPartitions而不是map,以及利用broadcast变量和collect_as_map函数减少数据传输。 9. **Spark SQL优化**:对于SQL查询,使用CBO(Cost-Based Optimization)替代...
用户可以通过转换操作(如map、filter)和行动操作(如count、collect)来处理RDD。 2. **DAG执行模型**:Spark基于DAG(有向无环图)的执行模型,将一系列操作组合成一个作业,然后优化为任务任务集。每个任务对应...
同时,`Stream API`的引入极大地增强了集合的操作能力,如`map()`、`filter()`、`reduce()`和`collect()`等,使得数据处理更加灵活。`Function`、`Consumer`、`Supplier`和`Predicate`等接口也是这一版本的重要组成...
2. **_.map() / _.collect()**:将数组中的每个元素通过指定的函数转换,返回新的数组。 3. **_.reduce() / _.foldl()**:对数组进行累加操作,将所有元素归一化为单个值。 4. **_.filter() / _.select()**:根据...
`filter`方法用于筛选出女生的记录,`map`方法将每个学生对象转换为其姓名,`collect`方法将转换后的结果收集到一个列表中。 Java8从List集合中取出某一属性的值的集合是一个非常有价值的知识点,它可以帮助我们更...
Java 8 Streams API是Java开发中的一个重要特性,它为处理集合数据提供了强大的工具。这个"StreamsAPIExample"项目显然是为了展示如何在实际编程中利用Java 8的Stream API。让我们深入探讨一下Stream API的核心概念...
4. **mapPartitions()**:与map类似,但在每个分区上并行应用函数,允许更细粒度的操作。 5. **reduceByKey()**:将具有相同键的元素组合在一起,通过一个可传递的函数进行减少。 6. **groupByKey()**:将数据按键...
这些词汇涵盖了牛津小学五年级英语第二学期的学习内容,包括日常生活、健康状况、学习活动、时间表达、家庭生活、兴趣爱好、动植物观察、个人习惯、情感表达等多个方面。以下是对这些词汇及其相关知识点的详细解释:...
Java 8 中的 Stream API 是一个强大的工具,它极大地简化了集合操作,使得代码更加简洁、易读。Stream API 的引入是为了支持函数式编程风格,它不仅提供了串行处理的能力,还支持并行处理,从而提高了程序的执行效率...