java8 自定义收集器

自定义收集用户行为统计库 (非常方便 可以自己拓展) 自定义收集用户行为统计库 (非常方便 可以自己拓展) 详细信息 http://blog.youkuaiyun.com/liudao7994/article/details/75434875 立即下载

java8自定义收集器

案例:接收参数int n,并将前n个自然数分为质数和非质数。


第一种方式自定义收集器

第一步:实现收集器接口,重写收集器方法,以及定义业务逻辑方法

package com.java8.CustomCollector;

import java.util.*;
import java.util.function.*;
import java.util.stream.Collector;

public class PrimeNumbersCollector implements Collector<Integer,Map<Boolean,List<Integer>>,Map<Boolean,List<Integer>>>{

    /**
     * 作用:创建结果容器
     * @return
     */
    @Override
    public Supplier<Map<Boolean,List<Integer>>> supplier() {
        return () -> new HashMap<Boolean,List<Integer>>(){{
            put(true,new ArrayList<>());
            put(false,new ArrayList<>());
        }};
    }

    /**
     * 作用:将元素添加到结果容器
     * @return
     */
    @Override
    public BiConsumer<Map<Boolean,List<Integer>>,Integer> accumulator() {
        return (Map<Boolean,List<Integer>> acc,Integer candidate) ->{
            acc.get(isPrime(acc.get(true)
                    ,candidate)
            ).add(candidate);
        };
    }

    /**
     * 对结果容器进行转换
     * @return
     */
    @Override
    public BinaryOperator<Map<Boolean,List<Integer>>> combiner() {
        return (Map<Boolean,List<Integer>> map1,
                Map<Boolean,List<Integer>> map2) ->{

            map1.get(true).addAll(map2.get(true));
            map1.get(false).addAll(map2.get(false));
            return map1;
        };
    }

    /**
     * 作用:当为并行流时,合并两个或多个结果容器
     * @return
     */
    @Override
    public Function<Map<Boolean,List<Integer>>,Map<Boolean,List<Integer>>> finisher() {
        return Function.identity();
    }

    /**
     * 作用:返回一个不可变的 Characteristics 集合
     * @return
     */
    @Override
    public Set<Characteristics> characteristics() {
        return Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.IDENTITY_FINISH));
    }

    /**
     * 行为参数化方法,
     * @param list
     * @param p
     * @param <A>
     * @return
     */
    public static <A> List<A> takeWhile(List<A> list, Predicate<A> p){
        int  i = 0;
        for(A item : list){
            if(!p.test(item)){
                return list.subList(0,i);
            }
            i++;
        }
        return list;
    }

    /**
     * 主要判断逻辑()判断是否是质数
     * @param primes
     * @param candidate
     * @return
     */
    public static boolean isPrime(List<Integer> primes,int candidate){
        int candidateRoot = (int)Math.sqrt((double)candidate);
        return takeWhile(primes,i -> i <= candidateRoot).stream().noneMatch(p ->candidate % p == 0);
    }
}


第二步:应用方法与java8内置收集归约函数做对比

package com.java8.CustomCollector;

import java.util.List;
import java.util.Map;
import java.util.stream.IntStream;

import static java.util.stream.Collectors.partitioningBy;

public class Test {
    public static void main(String[] arg){
        long fastest  = Long.MAX_VALUE;
        for(int i = 0; i < 10 ;i++){
            long start = System.nanoTime();
            partitionPrimes(1000000);
            long duration = (System.nanoTime() - start) / 1000000;
            if (duration < fastest ) fastest = duration;
        }
        System.out.println("Fastest execution done in " + fastest +" msecs");

        for(int i = 0; i < 10 ;i++){
            long start = System.nanoTime();
            partitionPaimesWithCustomCollector(1000000);
            long duration = (System.nanoTime() - start) / 1000000;
            if (duration < fastest ) fastest = duration;
        }
        System.out.println("CustomCollector Fastest execution done in " + fastest +" msecs");
    }


    /**
     * 自定义收集器调用
     * @param n
     * @return
     */
    public static  Map<Boolean,List<Integer>> partitionPaimesWithCustomCollector(int n){
        return IntStream.rangeClosed(2,n).boxed().collect(new PrimeNumbersCollector());
    }


    /**
     *采用系统分区函数
     * @param n
     * @return
     */
    public static Map<Boolean,List<Integer>> partitionPrimes(int n){
        return IntStream.rangeClosed(2,n).
                boxed().
                collect(partitioningBy(candidate -> isPrime(candidate)));
    }


    /**
     *判断是否为质数
     * @param candidate
     * @return
     */
    public static boolean isPrime(int candidate){
        int candidateRoot = (int)Math.sqrt((double)candidate);
        return IntStream.rangeClosed(2,candidateRoot).boxed().noneMatch(i -> candidate % i == 0);
    }

}


函数输出(提高了55%)

Fastest execution done in 865 msecs

CustomCollector Fastest execution done in 382 msecs


第二种方式实现自定义收集器

把实现核心逻辑的三个函数传给collect方法的重载版本来获得同样的结果。
package com.java8.CustomCollector;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Predicate;
import java.util.stream.IntStream;

import static java.util.stream.Collectors.partitioningBy;

public class Test {
    public static void main(String[] arg){
        long fastest  = Long.MAX_VALUE;
        for(int i = 0; i < 10 ;i++){
            long start = System.nanoTime();
            partitionPaimesWithCustomCollector(1000000);
            long duration = (System.nanoTime() - start) / 1000000;
            if (duration < fastest ) fastest = duration;
        }
        System.out.println("CustomCollector Fastest execution done in " + fastest +" msecs");
    }



    /**
     * 自定义收集器调用
     * @param n
     * @return
     */
    public static  Map<Boolean,List<Integer>> partitionPaimesWithCustomCollector(int n){
        return IntStream.rangeClosed(2,n).boxed().collect(
                ()->new HashMap<Boolean,List<Integer>>(){{
                    put(true,new ArrayList<>());
                    put(false,new ArrayList<>());
                }},
                (acc,candidate) ->{
                    acc.get(isPrime(acc.get(true)
                            ,candidate)
                    ).add(candidate);
                },
                (map1,map2) ->{
                    map1.get(true).addAll(map2.get(true));
                    map1.get(false).addAll(map2.get(false));
                });
    }
    public static <A> List<A> takeWhile(List<A> list, Predicate<A> p){
        int  i = 0;
        for(A item : list){
            if(!p.test(item)){
                return list.subList(0,i);
            }
            i++;
        }
        return list;
    }
    public static boolean isPrime(List<Integer> primes,int candidate){
        int candidateRoot = (int)Math.sqrt((double)candidate);
        return takeWhile(primes,i -> i <= candidateRoot).stream().noneMatch(p ->candidate % p == 0);
    }
}


收获:可以自己需要的时候开发自己的收集器 (虽然比较麻烦),可以用于追求性能的优化



java 8如何自定义收集器(collector)详解 主要给大家介绍了关于java 8如何自定义收集器(collector)的相关资料,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。 立即下载

相关推荐

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

主要介绍了Java8 Stream Collectors收集器使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

Java8实战-函数式数据处理-Steam流之收集器

Collectors类的静态工厂方法toList 把流中所有对象收集到一个List使用示例:List dishes = menuStream.collect(toList());toSet 把流中所有对象收集到一个Set,删除重复项使用示例:Set dishes = menuStream.collect(toSet());toCollection 把流中所有对象收集到给定的供应源创建的集合。

weixin_42872138的博客 636

深度理解嵌入(embedding)层

首先从one_hot开始: one_hot的优点:计算方便快捷、表达能力强。 one_hot的缺点:过于稀疏,过于占用资源,尤其是在数据量特别大时;数据之间完全独立。

weixin_44441131的博客 5661

【Java8】Java 中的 Stream 流收集器

Java 中 Stream 流用来帮助处理集合,类似于数据库中的操作。在 Stream 接口中,有一个抽象方法collect,你会发现 collect 是一个归约操作(高级规约),就像reduce一样可以接受各种做法作为参数,将流中的元素累积成一个汇总结果。具体的做法可以通过Collector接口来定义。// collect和reduce都是Stream接口中的汇总方法,collect方法接收一个Collector(收集器)作为参数收集器(Collector。

swadian2008的博客 1988

实验手册(灾难恢复)

我们发现DC1与DC2的复制出现问题,此时我们检查了在DC2中,DC1是否被正确注册。这里选择还原系统状态,因为我们原DC1上只备份了AD的数据,所以我们在新的这台服务器上还原的也是AD数据库。因为我们是单域下的测试,只测试了一个域,所以它会出现这样的报错。我们选择远程共享文件夹,我们备份的时候,是在备份这台服务器上的。同时删除SRV记录,A记录,NS记录,SOA记录,框框里面的所有有关dc1的记录全部删除。如果在企业中AD数据的备份是每周或者每月都会有一次备份,选择恢复AD数据库的时间。

weixin_52364868的博客 1310

状态转移矩阵在离散控制系统中的应用与实现步骤详解

本文深入解析了状态转移矩阵在离散控制系统中的核心作用与实现步骤。通过一个具体实例,详细演示了如何将连续状态空间模型精确离散化,计算出离散系统矩阵A_d和B_d,并分享了采样周期选择、数值计算技巧及嵌入式C语言实现等关键工程经验,为开发高性能数字控制器提供实用指南。

weixin_28454475的博客 382

java8自定义收集器_java8 自定义收集器

案例:接收第一种方式自定义收集器第一步:实现收集器接口,重写收集器方法,以及定义业务逻辑方法package com.java8.CustomCollector;import java.util.*;import java.util.function.*;import java.util.public class PrimeNumbersCollector implements Collector&...

weixin_39639174的博客 255

ASReview:基于主动学习的AI文献筛选工具,提升科研效率

主动学习是机器学习的一个重要分支,其核心原理是让算法能够主动选择最有价值的数据进行标注,从而以更低的成本获得更好的模型性能。这一技术通过人机协作的闭环流程,显著提升了数据标注和模型训练的效率和精度。在工程实践中,主动学习尤其适用于数据标注成本高昂或数据类别不平衡的场景,例如医学影像分析、自然语言处理中的文本分类以及推荐系统的冷启动问题。通过优先标注模型最不确定的样本,它能够有效解决传统机器学习面临的冷启动和数据稀疏性挑战。本文聚焦的ASReview项目,正是将主动学习原理应用于系统文献综述这一具体场景,通过

weixin_28725959的博客 432

Java8 新特性 Colletor 收集器自定义

需要在一个乘机人数组中先按照乘机人类型分类,在对分组后的元素属性进行聚合,以达到一个 K -> V => ADT -> 张三;李四;王五,这样的Map结构,但是普通常用的流收集器是达不到这样的效果的,最后经过研究Collector并且参考资料后总结自定义一个收集器来操作运转,话不多说了,贴代码 先贴一份demo demo代码 // Bean对象,模拟 @Data @Accessors(chain = true) class TestBean { public String name

正儿八经的胡说八道的博客 770

YOLOv8/v9轻量化优化:剪枝30%+蒸馏提精,模型体积缩至4MB还能跑Jetson

剪枝:用敏感度分析找到“可牺牲的30%”,不碰核心特征;蒸馏:借大模型的“经验”补回精度,甚至反超原始小模型;量化:针对边缘设备特性优化量化策略,把体积和延迟压到最低。如果你的项目卡在边缘部署(速度慢/体积大),按“剪枝→蒸馏→量化”三步走,90%能在Jetson上跑通30FPS+的实时检测。需要轻量化模型文件(v8s/v9s剪枝蒸馏后权重)、剪枝工具和Jetson部署脚本的,评论区扣“轻量化”,直接发你可运行版本~

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 669

华为OD机试新系统真题【仓库盘点】

华为OD机试真题 新系统【仓库盘点】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【仓库盘点】

qq_45776114的博客 577

java8-用流收集数据-6

在本例中,groupingBy说的是“生成一个Map,它的键是(货币)桶,值则是桶中那些元素的列表”。如图6-4所示,分组操作的结果是一个ap,把分组函数返回的值作为映射的键,把流中所有具有这个分类值的项目的列表作为对应的映射值。你可以把单参数reducing工厂方法创建的收集器看作三参数方法的特殊情况,它把流中的第一个项目作为起点,把恒等函数(即一个函数仅仅是返回其输入参数)作为一个转换函数。例如,在前面所示的交易分组的例子中,转换函数提取了每笔交易的货币,随后使用货币作为键,将交易本身。

wcg_jishuo的专栏 863

yolov26改进 | 融合改进篇 | 基于 MobileNetV4 和双向特征金字塔网络BiFPN的融合改进(全网独家首发)

本文介绍BiFPN与MobileNetV4融合改进的YOLOv26。许多模块单独使用能够涨点,但直接叠加后可能因功能重复、通道不匹配、尺度冲突而掉点,因此融合前必须理解各模块作用。MobileNetV4利用UIB与Mobile MQA构建轻量主干,提升特征提取能力;BiFPN通过可学习权重完成双向多尺度融合,强化大、中、小目标的信息交互。两者优化Backbone与Neck,功能互补、结构冲突较少。本文提供代码、配置、消融对比及Codex修改思路,MobileNetV4也可替换其他主干,便于组合实验与二次创新

Snu77的博客 244

java 8流自定义收集器_Java 8中的自定义收集器

在Java 8可用的众多功能中,就编写Java代码的方式而言, 流似乎是最大的游戏改变者之一。 用法非常简单:流是从集合(或从实用程序类的静态方法)创建的,使用一种或多种可用的流方法进行处理,然后将其收集回集合或对象中。 通常使用Collectors实用程序类提供的一种静态方法: Collectors.toList() Collectors.toSet() Collectors....

dlz00001的博客 303

零基础学simulink仿真建模--基于Simulink进行近端策略优化(PPO)路径规划的仿真建模

特点高效性与稳定性:通过引入剪裁机制,在更新策略时限制步长,从而提高了训练过程的稳定性和效率。适用于多种动作空间:可以处理连续和离散的动作空间问题。无需模型:不需要预先知道环境的确切模型,适合复杂或未知环境。挑战收敛速度与稳定性:确保算法能够在合理的时间内找到近似最优解,并保持训练过程的稳定性。探索与利用平衡:在探索新路径和利用已知信息之间取得平衡。计算资源:对于大规模状态空间和动作空间,计算资源需求较高。首先明确要模拟的任务内容。目标(例如到达指定地点、避开障碍物等)。

amy_mhd的博客 252

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

java 8流自定义收集器_Java 8编写自定义收集器简介

java 8流自定义收集器 Java 8引入了收集器的概念。 大多数时候,我们几乎不使用Collectors类中的工厂方法,例如collect(toList()) , toSet()或其他更有趣的方法,例如counting()或groupingBy() 。 实际上,没有多少人真正去研究如何定义和实现收集器。 让我们从分析Collector<T, A, R>真正含义及其工作原理开始。...

最佳 Java 编程 177

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java 8编写自定义收集器简介

Java 8引入了收集器的概念。 大多数时候,我们几乎不使用Collectors类中的工厂方法,例如collect(toList()) , toSet()或其他更花哨的方法,例如counting()或groupingBy() 。 实际上,没有多少人真正去研究如何定义和实现收集器。 让我们从分析Collector<T, A, R>真正含义及其工作原理开始。 Collector&...

最佳 Java 编程 304

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【Java】Java8 stream实现Collector接口来自定义收集器

自从学习了Java 8函数是编程后,彻底的被Java 8所以吸引。其中最重要的一个优点就是Stream API 。stream和lambda表达式让我们平时对集合的操作更加的便捷,省去复杂的for循环嵌套,和繁琐的容器创建,让代码更加美观。 在stream api 的终止操作中,Java已经为我们提供了许多方便好用的收集器,使我们能够从流中收集到我们想要的结果。但是有的时候内置的收集器也可能不能满足大家的需求,这个时候我们就可以利用Java预留的接口来定制自己的收集器了。

weixin_38538285的博客 1742

Java8-16-Stream 收集器 02-分区+收集器接口+自定义收集器

文章目录分区分区的概念例子获取为 true 的列表分区的优势partitioningBy 传递第二个收集器partitioningBy 和 maxBy 结合将数字按质数和非质数分区谓词的确定初步实现收集器接口接口的定义理解 Collector 接口声明的方法1. 建立新的结果容器:supplier 方法2. 将元素添加到结果容器:accumulator 方法3. 对结果容器应用最终转换:finis...

1万+

Java8自定义收集器

cxy_19891109的博客 332

JAVA 自定义解析stream_Java 8之自定义Stream收集器

声明:本篇文章除部分引用外,均为原创内容,如有雷同纯属巧合,引用转载请附上原文链接与声明本文链接:注:阅读本篇文章需掌握java集合基础知识、Stream基本语法与使用、函数式接口、lambda表达式、泛型知识、lombok插件使用、guava基础集合工具使用、java8双冒号的使用;请先掌握上述知识再行阅读本篇文章。若有错误,欢迎友好纠正,谢谢。参考引用文章大纲Stream基础收集功能演示Str...

weixin_33794626的博客 1003

java安装_Java 8编写自定义收集器简介

java安装 Java 8引入了收集器的概念。 大多数时候,我们几乎不使用Collectors类中的工厂方法,例如collect(toList()) , toSet()或其他更花哨的方法,例如counting()或groupingBy() 。 实际上,没有多少人真正去研究如何定义和实现收集器。 让我们从分析Collector<T, A, R>真正含义及其工作原理开始。 Collec...

cunhui1209的博客 95

java8源码_Java8-11-Stream收集器源码分析与自定义收集器

上一篇我们系统的学习了Stream的分组分区,本篇我们学习下Stream中的收集器。那么什么是收集器呢,在之前的课程中,我们学习了可以通过Stream对集合中的元素进行例如映射,过滤,分组,分区等操作。例如下面将所有元素转成大写就是用map映射操作List list = Arrays.asList("hello", "world", "helloworld");List collect = lis...

weixin_34125336的博客 259

java8 泛型 null 报错_Java8学习笔记(十)--自定义收集器

前言以前写过Java8中的自定义收集器,当时只是在文章末尾放了个例子,觉得基本用法挺简单,而且有些东西没搞懂(比如combiner方法到底做什么的),没有专门写,过了一段时间又忘了,所以,即使还是没搞懂combiner方法,还是硬着头皮把使用的经验记录下,方便以后参考。简介要实现自定义收集器,只需要实现java.util.stream.Collector接口即可,这个接口包含五个无参方法:[sup...

weixin_39710041的博客 246

分组,采样和批处理– Java 8中的自定义收集器

在第一篇文章的后续部分,这次我们将编写一些更有用的自定义收集器:用于按给定的标准进行分组,采样输入,批处理和在固定大小的窗口上滑动。 分组(计数事件,直方图) 假设您有一些项目的集合,并且想要计算每个项目(相对于equals() )出现在此集合中的次数。 这可以使用Apache Commons Collections的CollectionUtils.getCardinalityMap()...

最佳 Java 编程 398

Java8的自定义收集器与并行

为什么80%的码农都做不了架构师?>>> ...

weixin_34297300的博客 92
上一篇: 正则表达式(胡乱记)
下一篇: Socket 简单交互案例
Mark_XC
博客等级 码龄9年 16粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值