java8之lamda groupingby多层 嵌套[通俗易懂]

java8之lamda groupingby多层 嵌套[通俗易懂]@Testpublicvoidr(){List<Person>javaProgrammers=newArrayList<Person>(){{add(newPerson("Elsdon","1","Javaprogrammer","male",43,2000));

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

@Test
public void r(){
    List<Person> javaProgrammers = new ArrayList<Person>() {
        {
            add(new Person("Elsdon", "1", "Java programmer", "male", 43, 2000));
            add(new Person("Elsdon", "1", "Java programmer", "female", 23, 1500));
            add(new Person("Elsdon", "Jaycob", "Java programmer", "male", 33, 1800));
            add(new Person("Elsdon", "Jaycob", "Java programmer", "female", 32, 1600));
            add(new Person("Elsdon", "Jaycob", "Java programmer", "male", 22, 1200));
            add(new Person("Maude", "2", "Java programmer", "female", 27, 1900));
            add(new Person("Maude", "2", "Java programmer", "male", 30, 2300));
            add(new Person("Maude", "Jaimie", "Java programmer", "female", 35, 1700));
            add(new Person("Maude", "Jaimie", "Java programmer", "male", 33, 2000));
            add(new Person("Maude", "Jaimie", "Java programmer", "female", 34, 1300));
        }
    };

    List<Person> phpProgrammers = new ArrayList<Person>() {
        {
            add(new Person("Jarrod", "Pace", "PHP programmer", "male", 34, 1550));
            add(new Person("Clarette", "Cicely", "PHP programmer", "female", 23, 1200));
            add(new Person("Victor", "Channing", "PHP programmer", "male", 32, 1600));
            add(new Person("Tori", "Sheryl", "PHP programmer", "female", 21, 1000));
            add(new Person("Osborne", "Shad", "PHP programmer", "male", 32, 1100));
            add(new Person("Rosalind", "Layla", "PHP programmer", "female", 25, 1300));
            add(new Person("Fraser", "Hewie", "PHP programmer", "male", 36, 1100));
            add(new Person("Quinn", "Tamara", "PHP programmer", "female", 21, 1000));
            add(new Person("Alvin", "Lance", "PHP programmer", "male", 38, 1600));
            add(new Person("Evonne", "Shari", "PHP programmer", "female", 40, 1800));
        }
    };

 Map<String, Map<String, List<Person>>> z = javaProgrammers.stream().collect(Collectors.groupingBy(t > t.getFirstName(), Collectors.groupingBy(r -> r.getLastName())));
        z.forEach((k, v) -> {
            v.forEach((k1, v1) -> {
                v1.forEach(v2 -> System.out.println(v2.getFirstName() + v2.getLastName()));
            });
        });
    }

补充下源码的理解

首先groupBy有三个方法,前两个方法是起到一个参数补充作用(有具体知道这个的术语的吗)

第一种是我们常用的方法只需要传递一个Function用于获取key值。
public static <T, K> Collector<T, ?, Map<K, List<T>>>
groupingBy(Function<? super T, ? extends K> classifier) {
    return groupingBy(classifier, toList());
}

这个就是嵌套写法。需要传递一个新的Collector进去。理解起来就是接收Collector类型作为参数之一,同时返回一个Collector类型,这就是嵌套调用的基础。

public static <T, K, A, D>
Collector<T, ?, Map<K, D>> groupingBy(Function<? super T, ? extends K> classifier,
                                      Collector<? super T, A, D> downstream) {
    return groupingBy(classifier, HashMap::new, downstream);
}

真正的实现是第三个方法。 downstreamAccumulator.accept(container, t);从这里我们知道,先执行的外层的 Accumulator方法,

  public static <T, K, D, A, M extends Map<K, D>>
    Collector<T, ?, M> groupingBy(Function<? super T, ? extends K> classifier,
                                  Supplier<M> mapFactory,
                                  Collector<? super T, A, D> downstream) {
        Supplier<A> downstreamSupplier = downstream.supplier();
        BiConsumer<A, ? super T> downstreamAccumulator = downstream.accumulator();
        BiConsumer<Map<K, A>, T> accumulator = (m, t) -> {
            K key = Objects.requireNonNull(classifier.apply(t), "element cannot be mapped to a null key");
            A container = m.computeIfAbsent(key, k -> downstreamSupplier.get());
            downstreamAccumulator.accept(container, t);
        };
        BinaryOperator<Map<K, A>> merger = Collectors.<K, A, Map<K, A>>mapMerger(downstream.combiner());
        @SuppressWarnings("unchecked")
        Supplier<Map<K, A>> mangledFactory = (Supplier<Map<K, A>>) mapFactory;

        if (downstream.characteristics().contains(Collector.Characteristics.IDENTITY_FINISH)) {
            return new CollectorImpl<>(mangledFactory, accumulator, merger, CH_ID);
        }
        else {
            @SuppressWarnings("unchecked")
            Function<A, A> downstreamFinisher = (Function<A, A>) downstream.finisher();
            Function<Map<K, A>, M> finisher = intermediate -> {
                intermediate.replaceAll((k, v) -> downstreamFinisher.apply(v));
                @SuppressWarnings("unchecked")
                M castResult = (M) intermediate;
                return castResult;
            };
            return new CollectorImpl<>(mangledFactory, accumulator, merger, finisher, CH_NOID);
        }
    }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/171299.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 初识Zigbee协议栈及其安装

    初识Zigbee协议栈及其安装1.什么是Zigbee协议栈?什么是ZigBee协议栈呢?它和ZigBee协议有什么关系呢?协议是一系列的通信标准,通信双方需要共同按照这一标准进行正常的数据发射和接收。协议栈是协议的具体实现形式,通俗点来理解就是协议栈是协议和用户之间的一个接口,开发人员通过使用协议栈来使用这个协议的,进而实现无线数据收发。ZigBee的协议分为两部分,IEEE802.15.4定义了PHY(物理层)和MAC(介质访问层)技术规范;ZigBee联盟定义了NWK(网络层)、APS(

    2022年5月8日
    39
  • bcd码与十进制转换方法_5421bcd码转换十进制

    bcd码与十进制转换方法_5421bcd码转换十进制BCD码其实就是之前在数字电路中说的用4位二进制数值来表示一个0-9中的数字,例如:0000=00001=10010=20011=3也就是说如果把一个数字作为一个BCD码,例如:112

    2022年8月6日
    5
  • pycharm专业版下载安装教程_pycharm安装后无解释器

    pycharm专业版下载安装教程_pycharm安装后无解释器常见的pycharm是收费的,或者需要序列号,找起来很麻烦,现在介绍一款免费使用的pycharm–教育版。下面介绍一下pycharm的安装过程和使用中常见的一些问题。一、安装pycharm下载地址:https://www.jetbrains.com/pycharm-edu/ 。下载之后双击即可安装,安装过程中一直点击下一步即可。二、更换主题1.点击File-&gt;S…

    2022年8月25日
    6
  • 孙鑫老师 java从入门到精通 视频教程 批量下载

    孙鑫老师 java从入门到精通 视频教程 批量下载本视频教程是孙鑫老师亲自开发录制的,内容涵盖了java技术从入门到精通整个过程。对于java爱好者是一套不可多得的教材!相信下载此教程的同志都是未来的电脑高手,对于批量下载的方法我在这时就不一一说了,相信兄弟们都能找到这种简单规律。这里以第三课批量下载为例简单说一下:(记得将通配符长度设为1哦)第一课Java的一些基本概念http://www.ibook8.com/te

    2022年5月17日
    39
  • 安装虚拟机不支持i686 cpu的解决办法

    安装虚拟机不支持i686 cpu的解决办法作者:朱金灿来源:http://blog.csdn.net/clever101在thinkpad笔记本上安装ubuntu-14.04-desktop虚拟机,提示:thiskernelrequresanx86-64cpu,butonlydetectedani686cpu,如图:网上搜了下,是电脑的bios的虚拟化选项没有打开的缘…

    2022年6月4日
    100
  • PostgreSQL 9.6.1,9.5.5,9.4.10,9.3.15,9.2.19和9.1.24发布!

    PostgreSQL 9.6.1,9.5.5,9.4.10,9.3.15,9.2.19和9.1.24发布!

    2022年2月22日
    59

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号