J2SE 5.0 Generic应用一:类型安全的functor
一、简介
函数式编程是非常常用和非常重要的一种编程范式,有的语言直接提供支持,C++则通过()运算符重载和模板提供了还算灵活的支持,而Java中的函数式编程则由于语言本身的局限没有得到广泛应用,Apache Commons Functor 项目是一个正在开发中的函数式编程库,但目前看来并不是类型安全的;J2SE 5.0提供了有限的generic能力,除了用于Collection之外,类型安全的functor也是其用武之地,已有一个开源项目Generic Algorithms for Java开始了这方面的工作
二、示例
public interface UnaryFunction<R, P> { R evaluate(P obj); }
public interface UnaryPredicate<T> { boolean test(T obj); }
public interface UnaryProcedure<T> { void run(T obj); }
public interface BinaryFunction<R, T, S> { R evaluate(T left, S right); }
public interface BinaryPredicate<T, S> { boolean test(T left, S right); }
public interface BinaryProcedure<T, S> { void run(T left, S right); }
public interface Filter<T> extends UnaryFunction<T, T>{ }
public static <Destination, Source> List<Destination> transform(Collection<Source> source, UnaryFunction<Destination, Source> transformer){ List<Destination> result = new ArrayList<Destination>(); for(Source item : source){ result.add(transformer.evaluate(item)); } return result; }
public static <T> List<T> select(Collection<T> source, UnaryPredicate<T> selector){ List<T> result = new ArrayList<T>(); for(T item : source){ if(selector.test(item)){ result.add(item); } } return result; }
public static <T> void foreach(Collection<T> source, UnaryProcedure<T> procedure){ for(T item : source){ procedure.run(item); } }
public class And<T> implements UnaryPredicate<T>, Serializable{ private UnaryPredicate<T>[] predicates; public And(UnaryPredicate<T>... predicates){ this.predicates = predicates; } public boolean test(T obj) { for(UnaryPredicate<T> predicate : predicates){ if( !predicate.test(obj) ){ return false; } } return true; } public static <T> And<T> and(UnaryPredicate<T>... predicates){ return new And<T>(predicates); } }
public class Or<T> implements UnaryPredicate<T>, Serializable{ private UnaryPredicate<T>[] predicates; public Or(UnaryPredicate<T>... predicates){ this.predicates = predicates; } public boolean test(T obj) { for(UnaryPredicate<T> predicate : predicates){ if( predicate.test(obj) ){ return true; } } return false; } public static <T> Or<T> or(UnaryPredicate<T>... predicates){ return new Or<T>(predicates); } }
public class Not<T> implements UnaryPredicate<T>, Serializable{ private UnaryPredicate<T> predicate; public Not(UnaryPredicate<T> predicate){ this.predicate = predicate; } public boolean test(T obj) { return !predicate.test(obj); } public static <T> Not<T> not(UnaryPredicate<T> predicate){ return new Not<T>(predicate); } }
三、问题
1,interface vs. functor
functor在Java里就是一个“只包含一个method的接口”,在使用接口的大部分地方都可以使用functor,优点是低侵入性(不需要实现接口),缺点是无法访问类的私有信息;鉴于目前Generic的实现,涉及到Java动态特性(序列化/反序列化,反射等)的模块,优先使用interface,其它场合可酌情使用泛化的functor
2,function vs. functor
只在内部使用的,做成function,在多处使用的,做成functor
3,classic vs. modern
传统分支控制语句if,else,switch在面向对象的程序中,可使用“子类化”大面积的消除
传统循环控制语句for,do while也该使用“algorithm + functor”大面积消除了
|
相关推荐
J2SE5.0_CN.chm API中文手册
JAVA API帮助文档 中文版 CHM版 J2SE5.0
j2se5.0中文版api第2部分,因为上传权限有限,给大家带来不便,请见谅
很好用的J2SE 5.0 API,具有索引的功能!!!
J2SE5.0 API.chm,这个是英文的,等会再上传中文的,两个加在一起太大了 只好分开传了。。。
很好的j2se的API
Java (J2SE 5.0) and C# Comparison Java (J2SE 5.0) and C# Comparison
对J2SE 5.0中的一些新特性进行了精辟的讲解。
对于java开发人员来说 没有一个帮助文档是很郁闷的 尤其对于自学的朋友们,今天得到一个中文版的J2SE5.0的API,不敢独自享用,共享出来给大家,分为2个部分part01和part02
在Eclipse 3.1中体验J2SE 5.0的新特性
提示:本人已将一次性可完整下载版上传,名称为:J2SE 5.0 API (中文版)方便网友下载! 很好用的J2SE 5.0 API,具有索引的功能!!! 下载前请注意:不过由于本人等级太低所以只能分3部分上传,劳烦您下载全部3部分...
提示:本人已将一次性可完整下载版上传,名称为:J2SE 5.0 API (中文版)方便网友下载! 很好用的J2SE 5.0 API,具有索引的功能!!! 下载前请注意:不过由于本人等级太低所以只能分3部分上传,劳烦您下载全部3部分...
提示:本人已将一次性可完整下载版上传,名称为:J2SE 5.0 API (中文版)方便网友下载! 很好用的J2SE 5.0 API,具有索引的功能!!! 下载前请注意:不过由于本人等级太低所以只能分3部分上传,劳烦您下载全部3部分...
真正的j2se api 5.0 中文版帮助,有需要的可以下载.
J2SE 5.0- Java安全及网络计算的最新技术
Java API帮助文档 J2SE5.0 网页版
2022年J2SE5.0新特性之使用代理服务器Java教程.docx
由韩国出版的J2SE 5.0版的JAVA 2教材源代码
使用如JCreater这类的java简易编程软件,可以利用html格式的api帮助文档实现自动提示功能,不会再产生拼写错误问题! 用法(以JCreater):安装完成后,在提示信息中填入html格式api所在的目录即可。
J2SE5.0API.