Java9中新增的Collector收集器

目录
  • Filtering Collector
  • FlatMapping Collector
  • 结论

前言:

Java 8中添加了收集器Collectors,这有助于将输入元素累积到诸如MapListSet等可变容器中。

在本文中,我们将探讨Java 9中添加的两个新收集器:Collectors.filtering 和 Collectors.flatMappingflatMapping与收集器结合使用。通过提供智能元素集合进行分组。

Filtering Collector

Collectors.filtering类似于流过滤器Stream filter();它用于过滤输入元素,但用于不同的场景。流的过滤器在流链中使用,而过滤是一个收集器,设计用于与groupingBy一起使用。

使用流的过滤器,首先过滤值,然后对其进行分组。这样,被过滤掉的值就消失了,没有任何痕迹。如果我们需要一个跟踪,那么我们需要先分组,然后应用过滤,这实际上是Collectors.filtering做的。

Collectors.filtering功能用于过滤输入元素,收集器用于收集过滤后的元素:

@Test
public void givenList_whenSatifyPredicate_thenMapValueWithOccurences() {
    List<Integer> numbers = List.of(1, 2, 3, 5, 5);

    Map<Integer, Long> result = numbers.stream()
      .filter(val -> val > 3)
      .collect(Collectors.groupingBy(i -> i, Collectors.counting()));

    assertEquals(1, result.size());

    result = numbers.stream()
      .collect(Collectors.groupingBy(i -> i,
        Collectors.filtering(val -> val > 3, Collectors.counting())));

    assertEquals(4, result.size());
}

FlatMapping Collector

Collectors.flatMapping类似于Collectors.mapping。但有一个更细粒度的目标。两个采集器都接受一个函数和一个采集器,其中收集元素,但flatMapping函数接受元素流,然后由采集器累积。

让我们看看下面的模型类:

class Blog {
    private String authorName;
    private List<String> comments;

    // constructor and getters
}

Collectors.flatMapping允许我们跳过中间集合,直接写入映射到收集器定义的组的单个容器。

分组方式:

@Test
public void givenListOfBlogs_whenAuthorName_thenMapAuthorWithComments() {
    Blog blog1 = new Blog("1", "Nice", "Very Nice");
    Blog blog2 = new Blog("2", "Disappointing", "Ok", "Could be better");
    List<Blog> blogs = List.of(blog1, blog2);

    Map<String,  List<List<String>>> authorComments1 = blogs.stream()
     .collect(Collectors.groupingBy(Blog::getAuthorName,
       Collectors.mapping(Blog::getComments, Collectors.toList())));

    assertEquals(2, authorComments1.size());
    assertEquals(2, authorComments1.get("1").get(0).size());
    assertEquals(3, authorComments1.get("2").get(0).size());

    Map<String, List<String>> authorComments2 = blogs.stream()
      .collect(Collectors.groupingBy(Blog::getAuthorName,
        Collectors.flatMapping(blog -> blog.getComments().stream(),
        Collectors.toList())));

    assertEquals(2, authorComments2.size());
    assertEquals(2, authorComments2.get("1").size());
    assertEquals(3, authorComments2.get("2").size());
}

Collectors.mapping将所有分组作者的注释映射到收集器的容器(即列表),而此中间集合将使用flatMapping删除,因为它提供了要映射到收集器容器的注释列表的直接流。

结论

本文说明了Java9中引入的新收集器的使用,即Collectors.filtering() 和 Collectors.flatMapping()Collectors.groupingBy()结合使用。

这些收集器也可以与Collectors.partitioningBy()一起使用。但它只根据条件创建两个分区,并且没有利用收集器的实际功能;

本文中代码片段的完整源代码可在GitHub上获得:

到此这篇关于Java9中新增的Collector收集器的文章就介绍到这了,更多相关Java9 Collector内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java8 Stream Collectors收集器使用方法解析

    Collectors.toMap: Student studentA = new Student("20190001","小明"); Student studentB = new Student("20190002","小红"); Student studentC = new Student("20190003","小丁"); //Function.identity() 获取这个对象本身

  • java 8如何自定义收集器(collector)详解

    需求: 将 一个容器List<Bean> 按照一定的字段进行分组,分组过后的值为特定的BEAN 里面的属性例如: 假定有这样一个Bean public class SubjectOberser{ private String subjectKey; private AbstractObserver abstractObserver; ...geter seter 方法... } 我们需要按照 subjectKey 进行分组,分组过后的内容 应该为这样一个容器Map<String,List

  • Java9中新增的Collector收集器

    目录 Filtering Collector FlatMapping Collector 结论 前言: Java 8中添加了收集器Collectors,这有助于将输入元素累积到诸如Map.List和Set等可变容器中. 在本文中,我们将探讨Java 9中添加的两个新收集器:Collectors.filtering 和 Collectors.flatMapping.flatMapping与收集器结合使用.通过提供智能元素集合进行分组. Filtering Collector Collectors.

  • java中的GC收集器详情

    目录 1.GC(Garbage collection ) 2.GC算法 2.1标记活动对象 2.2 删除空闲对象 2.3 标记清除(Mark-Sweep) 2.4 清除压缩(Mark-Sweep-Compact) 2.5 标记和复制 3.JVM GC 3.1 JVM GC事件 3.2 Serial GC 3.3 Parallel GC 3.4 Concurrent Mark and Sweep 3.5 G1 –垃圾优先 4.总结 1.GC(Garbage collection ) 程序内存管理分

  • java收集器Collector案例汇总

    目录 一.收集器Collector 二.收集器工厂Collectors 2.1 变成ConcurrentMap 2.2 变成Map 2.3 变成Collection 2.4 变成String 2.5 计算最值 2.6 平均值 2.7 统计数据 2.8 求和 2.9 reducing函数 2.10 计数 2.11 分组-变成map 2.12 分组-变成ConcurrentMap 2.13 分割流 2.14 收集器 一.收集器Collector //T:表示流中每个元素的类型. A:表示中间结果容器

  • Java函数式编程(十):收集器

    前面我们已经用过几次collect()方法来将Stream返回的元素拼成ArrayList了.这是一个reduce操作,它对于将一个集合转化成另一种类型(通常是一个可变的集合)非常有用.collect()函数,如果和Collectors工具类里的一些方法结合起来使用的话,能提供极大的便利性,本节我们将会介绍到. 我们还是继续使用前面的Person列表作为例子,来看一下collect()方法到底有哪些能耐.假设我们要从原始列表中找出所有大于20岁的人.下面是使用了可变性和forEach()方法实现

  • 浅谈JAVA8给我带了什么——流的概念和收集器

    到现在为止,笔者不敢给流下定义,从概念来讲他应该也是一种数据元素才是.可是在我们前面的代码例子中我们可以看到他更多的好像在表示他是一组处理数据的行为组合.这让笔者很难去理解他的定义.所以笔者不表态.各位同志自行理解吧. 在没有流以前,处理集合里面的数据一般都会用到显示的迭代器.用一下前面学生的例子吧.目标是获得学分大于5的前俩位同学. package com.aomi; import java.util.ArrayList; import java.util.Iterator; import j

  • Java 流处理之收集器详解

    目录 收集所有记录的 列1 值,以列表形式存储结果 收集所有记录的 列1 值,且去重,以集合形式存储 收集记录的 列2 值和 列3 值的对应关系,以字典形式存储 收集所有记录中 列3 值最大的记录 收集所有记录中 列3 值的总和 创建一个中间结果容器 逐一遍历流中的每个元素,处理完成之后,添加到中间结果 中间结果转换成最终结果 combiner()是做什么的? characteristics()是什么的? 完整代码 Java 流(Stream)处理操作完成之后,我们可以收集这个流中的元素,使之汇

  • MySQL 8中新增的这三大索引 隐藏、降序、函数

    目录 MySQL 8中的隐藏.降序.函数索引 一.隐藏索引 1.隐藏索引概述 2.隐藏索引操作 二.降序索引 1.降序索引概述 2.降序索引操作 三.函数索引 1.函数索引概述 2.函数索引操作 MySQL 8中的隐藏.降序.函数索引 一.隐藏索引 1.隐藏索引概述 MySQL 8.0开始支持隐藏索引(invisible index),不可见索引. 隐藏索引不会被优化器使用,但仍然需要进行维护. 应用场景:软删除.灰度发布. 在之前MySQL的版本中,只能通过显式的方式删除索引,如果删除后发现索

  • SpringBoot中利用AOP和拦截器实现自定义注解

    目录 前言 Spring实现自定义注解 1.引入相关依赖 2.相关类 Java实现自定义注解 通过Cglib实现 通过JDk动态代理实现 Cglib和JDK动态代理的区别 写在最后 前言 最近遇到了这样一个工作场景,需要写一批dubbo接口,再将dubbo接口注册到网关中,但是当dubbo接口异常的时候会给前端返回非常不友好的异常.所以就想要对异常进行统一捕获处理,但是对于这种service接口使用@ExceptionHandler注解进行异常捕获也是捕获不到的,应为他不是Controller的

随机推荐