java8实战:使用流收集数据之toList、joining、groupBy(多字段分组)

本文深入剖析Java8的流处理,重点讲解Collectors的toList、joining(包括不同分隔符)以及groupBy的多字段分组。详细介绍了这些收集器的实现原理和使用示例,帮助开发者更好地理解和应用Java8的流API。
摘要由CSDN通过智能技术生成

java8专栏目录:

  1. java8实战读书笔记:Lambda表达式语法与函数式编程接口
  2. java8实战读书笔记:复合Lambda表达式
  3. java8实战读书笔记:初识Stream、流的基本操作(流计算)
  4. java8实战读书笔记:数值流、Stream创建与Optional类的使用
  5. java8读书笔记:探究java8流收集数据原理

本文将从Collectos中构建收集器入手,详细介绍java8提供了哪些收集器,重点介绍:toList、toSet、toCollection、joining、groupBy(包含多级分组)、reducing的核心实现原理与使用示例。

集合类操作

集合类操作包含toList、toSet、toCollection。首先对流中的数据进行计算,最终返回的数据类型为集合。Collectors中定义了如下3集合类收集器,其声明如下:

1publicstatic <T> Collector<T, ?, List<T>> toList()
2public static <T> Collector<T, ?, Set<T>> toSet()
3public static <T, C extends Collection<T>> Collector<T, ?, C> toCollection(Supplier<C> collectionFactory)

温馨提示:建议根据上篇的理论,再来反推一下这些Collector中的核心属性的值,例如supplier、accumulator、combiner、characteristics。不过特别注意,toList、toCollection是不支持并行运行的,但toSet()方法支持并行运行。

我们首先来看一个一直使用的示例,返回菜单中所有菜品的名称:

1publicstatic void test_toList(List<Dish> menu) {
      
2    List<String> names = menu.stream().map(Dish::getName)
3                        .collect(Collectors.toList());
4}

由于toList方法的实现原理已经在 java8读书笔记:探究java8流收集数据原理中也详细介绍,故本篇不再重点介绍。

joining

Collectors定义了如下3个重载方法。

1publicstatic Collector<CharSequence, ?, String> joining()
2public static Collector<CharSequence, ?, String> joining(CharSequence delimiter)
3public static Collector<CharSequence, ?, String> joining(CharSequence delimiter,
4    CharSequence prefix, CharSequence suffix)
2.1 joining
1publicstatic Collector<CharSequence, ?, String> joining() {
      
2    return new CollectorImpl<CharSequence, StringBuilder, String>(
3        StringBuilder::new, StringBuilder::append,
4        (r1, r2) -> {
       r1.append(r2); return r1; },
5        StringBuilder::toString, CH_NOID);
6}
  • Supplier< A> supplier() 其函数为StringBuilder::new,即通过该方法创建一个StringBuilder方法,作为累积器的初始值。
  • BiConsumer accumulator 累积器:StringBuilder::append,即会对流中的元素执行追加。
  • BinaryOperator< A> combiner 组合器,也是调用append方法,进行字符串的规约。
  • Function finisher 转换器:由于累积器返回的最终对象为StringBuilder,并不是目标String类型,故需要调用StringBuilder#toString方法进行转换
  • Set< Characteristics> characteristics 无任何行为。

从上面的函数定义我们可以得出该方法的作用:针对字符串流,会对流中的元素执行字符的追加动作,流元素之间没有分隔符号,示例如下:

2.2 joining(CharSequence delimiter)
1publicstatic Collector<CharSequence, ?, String> joining(CharSequence delimiter) {
      
 2    return joining(delimiter, "", "")
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值