Java9中新增的Collector收集器

 更新时间:2022年06月09日 14:48:40   作者: sofia   
这篇文章主要介绍了Java9中新增的Collector收集器,Collector作为收集器,简单来说就是将数据或元素收集到一起,并且flatMapping与收集器结合使用,通过提供智能元素集合进行分组。下文相关介绍需要的小伙伴可以参考一下

前言:

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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot整合Lucene实现全文检索的详细步骤

    SpringBoot整合Lucene实现全文检索的详细步骤

    全文搜索(Full-Text Search)是指对大规模存储在计算机系统中的文本数据进行检索和匹配的技术,它允许用户输入关键字,然后从海量的文本数据中快速找到相关的信息,本文介绍了SpringBoot整合Lucene实现全文检索的详细步骤,需要的朋友可以参考下
    2024-03-03
  • Java使用FileReader读取文件详解

    Java使用FileReader读取文件详解

    本文将为大家介绍FileReader类的基本用法,包括如何创建FileReader对象,如何读取文件,以及如何关闭流,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-09-09
  • idea2020.2卡死在reading maven projects

    idea2020.2卡死在reading maven projects

    这篇文章主要介绍了idea2020.2卡死在reading maven projects,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Java实现八种排序算法详细代码举例

    Java实现八种排序算法详细代码举例

    排序问题一直是程序员工作与面试的重点,今天特意整理研究下与大家共勉!这篇文章主要介绍了Java实现八种排序算法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-10-10
  • SpringBoot2.6.x默认禁用循环依赖后的问题解决

    SpringBoot2.6.x默认禁用循环依赖后的问题解决

    由于SpringBoot从底层逐渐引导开发者书写规范的代码,同时也是个忧伤的消息,循环依赖的应用场景实在是太广泛了,所以SpringBoot 2.6.x不推荐使用循环依赖,本文给大家说下SpringBoot2.6.x默认禁用循环依赖后的应对策略,感兴趣的朋友一起看看吧
    2022-02-02
  • 浅谈JavaIO之try with底层原理

    浅谈JavaIO之try with底层原理

    众所周知,所有被打开的系统资源,比如流、文件或者Socket连接等,都需要被开发者手动关闭,否则随着程序的不断运行,资源泄露将会累积成重大的生产事故。本文将介绍JavaIO之try with底层原理。
    2021-06-06
  • MyBatis配置不同级别的日志输出

    MyBatis配置不同级别的日志输出

    MyBatis提供多种日志框架集成,如SLF4J、Log4j2、Logback等,通过配置日志框架和调整日志级别,可以实现详细的SQL日志记录,本文就来介绍一下,感兴趣的可以了解一下
    2024-12-12
  • SpringBoot之如何搭建SpringBoot+Maven项目

    SpringBoot之如何搭建SpringBoot+Maven项目

    这篇文章主要介绍了SpringBoot之如何搭建SpringBoot+Maven项目问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • 详解Java如何关闭线程以及线程池

    详解Java如何关闭线程以及线程池

    java如何正确关闭线程以及线程池是一个高频的面试题,本文将为大家详细介绍实现的方法与代码,感兴趣的小伙伴快跟随小编一起学习一下
    2022-04-04
  • Spring框架配置java web实现实例化

    Spring框架配置java web实现实例化

    这篇文章主要介绍了Spring框架配置java web实现实例化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04

最新评论