Generic Java Functor 发布首个版本

C++函数模板与泛型编程:实现通用排序算法的核心原理与实践 在计算机科学中,排序算法是理解算法思想与评估程序效率的基石。其核心原理在于通过比较与交换操作,将数据元素按特定顺序重新排列,从而提升数据检索与处理的效率。从工程实践角度看,编写针对单一数据类型的排序函数容易导致代码冗余和维护困难。C++的函数模板技术为此提供了优雅的解决方案,它通过类型参数化实现了泛型编程,允许开发者编写一套通用的算法逻辑,由编译器自动为不同的数据类型生成具体代码。这种技术极大地提升了代码的复用性和健壮性。结合函数对象或Lambda表达式来自定义比较规则,可以进一步扩展排序算法的适用场景,使 阅读详情

〇,简介

Gavator(Generic Java Functor)试图探索以普通Java语法进行函数式编程的可行性,并尽可能的保证使用的方便性,良好的可读性和基本的类型安全性

一,功能

所有功能都是类型安全的,无需涉及强制转型

  • 提供了若干算法:transform/map, select/filter, accumulate/reduce, foreach/enumerate, findfirst等

  • 提供了若干适配器:bind,bind1st, bind2nd等

  • 提供了常用控制结构的函数形式和functor形式:dowhile/whiledo, dountil/untildo, ifelse等

  • 提供了常用逻辑运算结构的函数形式和functor形式:and,or,not等

  • 提供了常用数据结构:filter,pipe等

二,结构

Gavator的结构是层次化的

  • 最核心的是一组接口:分别定义了Procedure,Predicate,Function的零元,一元,二元形式

  • 基于这些接口,以functor的形式提供了常用概念的实现,包括数据结构,控制结构,适配器等,如Filter/Pipe,Bind,And/Or/Not,WhileDo/IfElse等

  • 基于这些结构和适配器,以function的形式实现了使用方便和可读性好的包装,如pipe,bind,and/or/not, ifelse等

三,用法

附带的测试用例可用来简单说明一下用法;其实所有functor和algorithm都很直观,看到名称和参数,即能领会它的用法;并且代码量非常少,半个小时就能将所有代码浏览一遍

曾经听说ThoughtWorks的敏捷项目中平均每个函数代码控制在三行以下,Gavator中每个函数平均只有不到两行代码

package gavator.test; 

import static gavator.algorithm.Algorithms.*;

import gavator.datastructure.*;

import junit.framework.*;

 

class ToUpperFilter implements Filter<String> {

     public String eval(String obj) {

         return obj.toUpperCase();

     }

} 

class ToLowerFilter implements Filter<String> {

     public String eval(String obj) {

         return obj.toLowerCase();

     }

} 

class DirtyWordsFilter implements Filter<String> {

     public String eval(String obj) {

         return obj.replace("dirty words", "***");

     }

}

 

public class FilterPipeTest extends TestCase {

 

     private Pipe lowerPipe, upperPipe, dirtyWordsPipe; 

     private String string = "abc"; 

     private String dws = "you said dirty words, so...";

 

     public void testFilter() {

         Assert.assertEquals("ABC", new ToUpperFilter().eval(string));

         Assert.assertEquals("abc", new ToLowerFilter().eval(new ToUpperFilter().eval(string)));

         Assert.assertEquals("you said ***, so...", new DirtyWordsFilter().eval(dws));

     } 

     public void testPipe() {

         lowerPipe = new Pipe<String>(new ToUpperFilter(), new ToLowerFilter());

         upperPipe = new Pipe<String>(new ToLowerFilter(), new ToUpperFilter());

         dirtyWordsPipe = new Pipe<String>(lowerPipe, new DirtyWordsFilter());

 

         Assert.assertEquals("abc", lowerPipe.eval("abc"));

         Assert.assertEquals("ABC", upperPipe.eval("abc"));

 

         Assert.assertEquals("hehe***", dirtyWordsPipe.eval("hehedirty words"));

         Assert.assertEquals("hehe***", pipe("hehedirty words", dirtyWordsPipe));

     } 

}

四,扩展

使用者可以在Gavator结构的任何一次层次对Gavator进行扩充,如扩充functor实现其它设计模式和常用概念,或编写更多的算法,结合import static,提高客户代码的可读性

目前Gavator to be contributed的是 ContinuationFramework 和 QueryFramework

五,问题
  • Gavator的主要思想来自C++ STL和Apache Common Funtor,我对纯粹的函数式语言如Scheme,Haskell并没有太多经验,因此Gavator最主要的问题是:它做的是否正确?

  • Gavator还不完整,如尚未将Functor实现为值语义等

  • 好的名称有助于减少文档,促进理解,但同一个概念在不同的社团可能有不同的惯用名称,如transform和map,select和filter,accumulate和reduce,等等;Gavator选择了使用STL和Apache Common Functor中的名称

  • 序列操作的参数应该是Collection还是Iterator ?STL和Apache Common Functor选择了Iterator,我感觉大部分情况下Collection更方便,就用了Collection

  • 目前Gavator其实并不是很实用,像ifelse等基本是花拳绣腿,关键是要基于Gavator,发展出专注于某个应用领域的framework,如Continuation和Query

六、其它

Java语言本身的简单,造成了对Functional Programming支持的限制,Apache Common Functor至今还是sandbox;这些限制包括:

  • 函数不是first class,不是一等公民,更别提lambda表达式

  • primitive type与class无法完全统一,你试试能否写一个通用的accumulate支持int集合,long集合,double集合的累加就知道了

  • 不支持操作符重载,当然,这不是本质问题

  • 使用擦拭法实现generic,使你不能对T调用任意函数,无法特化,没有typedef,只能用继承来模拟,任何动态特性都将使generic丧失类型安全性,如序列化后反序列化,反射等

  • 甚至不能return void,这使Procedure和Function在实现上无法统一以减少代码,虽然在概念上它们是独立的

或许Java平台上的函数式编程的支持将使用专门的语言来解决

Gavator起源于去年的一个项目,在那个项目里实现了一个基于Functor的查询框架,增加一种条件只需实现Condition接口,当然,Condition是一个Predicate,然后就可以和已有的各种Condition通过and,or,not等组合出各种复合查询,提供服务的一方通过恒定不变的代码select(Collection, Condition)来满足任意的查询;希望接下来实现一个封装了各种查询(对象,SQL,XPath/XQuery等)的QueryFramework

另外对Continuation的支持也值得一做,希望得到帮助,mailto:ajaxchelsea@163.com

 

functor 是什么? 引子 有一次在美团面试的时候,第二轮面试官问道:“听说过functor吗?”,妈呀,6年了,竟然没听说过这个概念,今天就学习了一会,哎,天不遂人愿,老天弄人啊,其实这个东西我们大家都不止一次的在使用它。举个例子(注意for_each的第三个参数): // for_each example #include // std::cout #include // std::for_e 阅读详情

相关推荐

MIC卡的OFED驱动安装

 IB网络和OFED驱动安装 IB InfiniBand是一个统一的互联结构,可以处理存储I/O、网络I/O和进程间通信(IPC)。它可以将磁盘阵列、SANs、LANs、服务器和集群服务器进行互联,也可以连接外部网络(比如WAN、VPN、互联网)。设计InfiniBand的目的主要是用于企业数据中心,大型的或小型的。目标主要是实现高的可靠性、可用性、可扩展性和高的性能。Inf

beglorious的专栏 5106

纯Java中的函数式编程:Functor和Monad示例

绝大多数程序员,特别是那些没有功能编程背景的程序员,都倾向于认为monad是某种神秘的计算机科学概念,因此从理论上讲,它对他们的编程事业没有帮助。这种消极的观点可以归因于数十篇文章或博客文章过于抽象或过于狭窄。但是事实证明,即使在标准Java库中,monad也无处不在,尤其是从Java Development Kit(JDK)8开始(以后会有更多介绍)。绝对妙不可言的是,一旦您第一次了解monad...

阿志同学 467

5.3 磁悬浮轴承:基于有限元法的电磁场分析

摘要:本文系统阐述了有限元法在磁悬浮轴承电磁场分析中的应用。相较于等效磁路法和解析法,有限元法能精确处理复杂几何、材料非线性和动态效应。重点介绍了三维静磁场仿真(用于计算稳态磁场、电磁力和电感)和瞬态磁场仿真(用于分析动态过程和损耗)的关键设置与后处理方法。通过有限元分析可验证承载力、评估损耗分布并指导结构优化,形成"磁路设计-有限元验证-参数修正"的闭环设计流程,为磁轴承的精确设计和性能评估提供可靠依据。

技术工作者 1293

在Java 8 Lambda上使用Apache Commons Functor功能接口

Apache Commons Functor (以下称为[functor])是一个Apache Commons组件,它提供功能性的编程API和已实现的几种模式(访问者,生成器,聚合器等)。 Java 8具有几个不错的新功能,包括lambda表达式和函数接口 。 在Java 8中,lambdas或lambdas表达式是闭包 ,可以对其求值,并且其行为类似于匿名方法。 功能接口是仅一种方法的...

最佳 Java 编程 292

SIwave学习记录:电热耦合仿真

SIwave电热耦合仿真

m0_68174736的博客 2335

Cadence 16.6与17.4双版本共存避坑指南:从安装顺序到环境变量配置

本文是一份详细的Cadence 16.6与17.4双版本共存实战指南。针对硬件工程师和PCB设计者同时处理新旧项目的需求,文章深入剖析了版本冲突根源,并提供了从安装顺序、环境隔离到故障排查的完整解决方案。核心在于通过环境变量精细化管理与脚本控制,实现两个版本的稳定共存与无缝切换,有效解决了文件关联混乱、交互布局失效等常见问题。

html8的博客 977

functor_纯Java中的Functor和Monad示例

functor 本文最初是我们使用RxJava进行React式编程的附录。 但是,尽管与React式编程非常相关,但对monad的介绍却不太适合。 因此,我决定将其取出并作为博客文章单独发布。 我知道,“ 我对单子的自己的,一半正确和一半的完整解释 ”是编程博客上的新“ Hello,world ”。 然而,本文从Java数据结构和库的特定角度研究了函子和monad。 因此,我认为值得分享。 ...

最佳 Java 编程 259

解读Autoware.Universe规划模块:Behavior Path Planner

Behavior Path Planner是一个基于行为生成不同形态路径的路径规划器,负责生成 基于交通状况的路径(path), 车辆可以移动的可行驶区域(drivable area)(在路径消息中定义), 将被发送到车辆接口的转向信号(turn signal) 命令。

策 5491

纯Java中的Functor和Monad示例

本文最初是我们使用RxJava进行反应式编程的附录。 但是,尽管与反应式编程非常相关,但对monad的介绍却不太适合。 因此,我决定将其取出并作为博客文章单独发布。 我知道,“ 我自己的,对单子的一半正确和半完全的解释 ”是编程博客上的新“ Hello,world ”。 然而,本文从Java数据结构和库的特定角度研究了函子和monad。 因此,我认为值得分享。 RxJava的设计和构建基...

最佳 Java 编程 782

电脑卸载神器Revo Uninstaller Pro,彻底清残留,终身无限制使用

打开软件后,它会自动扫描并列出电脑里所有已安装的程序,小到各种插件、大到专业设计软件和驱动程序,哪怕是隐藏的系统组件,都能给你扒出来,还会自动分类整理,加上搜索功能能快速定位目标软件,就算是电脑小白,也能轻松上手。卸载彻底无残留:能直接代替系统自带的 “添加 / 删除程序”,不光能正常卸载软件,还会通过内置卸载程序配合残留扫描,把软件留下的残留文件、垃圾还有注册表项都扫得明明白白,扫描强度有三档可以选,想清理得多干净都能自己定,删除之后电脑立马清爽不少。电脑用久了是不是越来越慢?

qq_75153390的博客 1746

深入解析机器人软件开发中的核心:状态机管理(FSM)—— 理论、实践与优化

状态机(FSM)是机器人软件开发中管理复杂行为逻辑的核心工具,广泛应用于导航、任务执行、故障处理等场景。本文系统探讨状态机的基础理论(定义、要素)、主流设计模式(经典FSM、分层状态机HSM、行为树BT),以及工业级实现方法(代码架构、线程安全、调试技巧)。通过移动机器人导航和机械臂任务执行的案例,分析分层状态机的实际应用,并总结常见陷阱(如状态爆炸、阻塞操作)与优化策略(异步化、事件过滤)。

郑伟强dev的专栏 292

Java中的Functor与monad

这篇文章最初是我们的Reactive Programming with RxJava一书中的附录,然而提到monad即使它与响应式编程有关,但也只是一点点,所以我决定把它单独拿出来出一篇博客。我意识到对monad一边解释一边纠正,对我而言这就像是在编程博客上使用“Hello World”一样(是对是错拉出来溜溜)。而且这篇文章从Java数据结构与库的角度...

weixin_33690963的博客 268

猫群优化算法(CSO)详解:从生物灵感到智能优化

猫群优化算法(CSO)是一种模拟猫科动物行为的群体智能优化算法。该算法基于猫的两种主要行为模式:搜寻状态(全局探索)和跟踪状态(局部开发)。CSO通过混合率(MR)动态调整两种模式的比例,实现探索与开发的平衡。算法核心包括搜寻模式的变异操作和跟踪模式的速度-位移模型,具有收敛性能好、全局搜索能力强等特点。相比传统优化算法,CSO在高维复杂问题中表现优异,已成功应用于函数优化、图像处理等多个领域。算法性能受混合率、变化域等参数影响,自适应参数策略可进一步提升优化效果。

qq_42212808的博客 617

J2SE 5.0 Generic应用

 J2SE 5.0 Generic应用一:类型安全的functor 一、简介    函数式编程是非常常用和非常重要的一种编程范式,有的语言直接提供支持,C++则通过()运算符重载和模板提供了还算灵活的支持,而Java中的函数式编程则由于语言本身的局限没有得到广泛应用,Apache Commons Functor 项目是一个正在开发中的函数式编程库,但目前看来并不是类型安全的;J2SE 5.0提供了

切尔斯基 3746

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

编程语言难度排名:从Python到Lisp,10种语言学习成本全解析

编程语言是开发者与计算机沟通的核心工具,其设计哲学和语法特性决定了学习曲线和应用场景。从原理上看,语言的难度通常由语法复杂度、概念抽象层级、生态成熟度等维度综合决定。在技术价值层面,易学的语言能快速实现想法、降低入门门槛,而复杂的语言则提供了更强的控制力、性能或独特的编程范式,适用于系统级开发、高性能计算或学术研究。常见的应用场景包括Web开发、数据分析、移动应用、操作系统、嵌入式系统等。本文基于‘编程语言难度测量仪’思维模型,对Python、JavaScript、Java、Go、C#、C++、Rust、H

weixin_33806914的博客 411

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C++ Lambda表达式:从语法到实战,掌握现代C++核心编程范式

在函数式编程和现代C++开发中,将函数作为参数传递是一种提升代码抽象和复用性的核心思想。其原理在于通过高阶函数或函数对象封装特定行为,使算法逻辑与数据操作解耦,从而增强代码的模块化和表达力。这一技术价值在于简化了回调机制和局部逻辑的封装,广泛应用于STL算法定制、事件处理和并发编程等场景。本文聚焦于C++ Lambda表达式,深入解析其捕获子句、参数列表和mutable关键字等核心语法,并结合STL算法与并发编程等实战案例,探讨如何避免悬垂引用等常见陷阱,帮助开发者掌握这一提升代码质量和开发效率的利器。

weixin_34062469的博客 560

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

java stl入门_Java基础学习:functor的实现

经常听到回调函数(callback function)这个概念, 所谓回调函数,就是指这个函数先在某处注册,而它将在稍后某个需要的时候被调用。比如在利用SDK 进行Windows编程的时候,我们需要注册一个WNDCLASS类,这个类中有这样一个参数 lpfnWndProc, 要进行消息处理,我们就要用处理消息的函数的指针给它赋值。消息处理函数什么时候被调用的?我们没有显式地在程序中看到啊。是OS调...

weixin_42365490的博客 154

Java中的Functor和Monad

​ 随着最近函数式编程(或函数式编程风格)的兴起,monads成为一个广泛讨论的话题。关于他们有很多民间传说: A monad is a monoid in the category of endofunctors, what’s the problem? 单子是内函子范畴中的一个幺半群,有什么问题吗? ​ — James Iry The curse of the monad is that once you get the epiphany, on

dx125806的博客 461

java callback参数_java中进行callback方法调用

回调函数(callback function)这个概念,所谓回调函数,就是指这个函数先在某处注册,而它将在稍后某个需要的时候被调用。比如在利用SDK进行Windows编程的时候,我们需要注册一个WNDCLASS类,这个类中有这样一个参数 lpfnWndProc,要进行消息处理,我们就要用处理消息的函数的指针给它赋值。消息处理函数什么时候被调用的?我们没有显式地在程序中看到啊。是OS调用的。这是SD...

weixin_39599342的博客 580

java中并或_Java中的Functor与monad

原文链接作者:Tomasz Nurkiewicz 译者:simonwang这篇文章最初是我们的Reactive Programming with RxJava一书中的附录,然而提到monad即使它与响应式编程有关,但也只是一点点,所以我决定把它单独拿出来出一篇博客。我意识到对monad一边解释一边纠正,对我而言这就像是在编程博客上使用“Hello World”一样(是对是错拉出来溜溜)。而且这...

weixin_39964833的博客 385

InnoDB 内存结构总览:Change Buffer、AHI 与 Log Buffer

本文系统梳理InnoDB内存结构中的ChangeBuffer、Adaptive Hash Index(AHI)与LogBuffer。ChangeBuffer缓存二级索引页不在内存时的变更,减少随机IO,仅在页加载时合并;聚簇索引修改立即执行,因数据本身不可延后。AHI基于高频等值查询自动构建哈希索引,加速定位,仅支持等值操作。LogBuffer为redo log内存缓冲,配合磁盘日志实现崩溃恢复。三者均服务于性能优化,其中ChangeBuffer与AHI共享BufferPool空间,而LogBuffer独立

bksczm的博客 282

Spring AI + GPT-5.5 + Ollama 配置教程:Base URL、超时与流式调用

由于不同 Spring AI、Spring Boot 小版本之间仍可能存在差异,创建项目时应检查 Spring Initializr、Spring AI BOM 和官方兼容矩阵,不要直接复制旧教程中的 Starter 名称和版本号。多人项目最好隔离不同客户端,并在脱敏前提下记录最终 URL、状态码、请求耗时、请求 ID 和模型 ID。Spring AI 接入模型 API,至少要同时确认 Starter、Base URL、请求路径、API Key、模型 ID、连接超时、读取超时和流式客户端这 8 项。

2601_95893075的博客 232

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 346

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 126

Spring Boot 数据源与 MyBatis(-Plus) 自定义配置详解

本文详解 Spring Boot 中单数据源环境下 HikariCP 与 MyBatis-Plus 的自定义配置。通过手动声明 SqlSessionFactory,实现下划线转驼峰、日志输出、一级缓存策略等精细化控制。结合 HikariCP 核心参数调优(如最大连接数、连接生命周期),确保高性能与稳定性。适用于仅需访问单一数据库的场景,避免多数据源复杂性,兼顾性能与可维护性。

BADAO_LIUMANG_QIZHI的博客 196
上一篇: Nucleus中的WebService
下一篇: Programming Ant
platformlib
博客等级 码龄22年 1粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值