注:在您阅读本篇的时候,希望你对Java Generic(范型)能够有所了解和明白。
记:周末在给javaparty讲FP中,很多人似乎对fp并不关心,也认为java中fp的作用不大。其实这是个很大的观念错误,范型的发展,对java的函数式编程支持很大,对Functor的影响也非常大。Functor在算法、逻辑、条件计算、规则引擎等等方面,都会有很大的作为,这个影响可就会深远的多了。—— 估且以此篇的开端,唤醒java开发者对FP in Java的重新认识。
周六给javaparty讲了java中的函数编程(Functional Programming in Java),但由于自己准备的不充分,讲的并不深入。估且再写点blog补充一下。当然,接下来的日子里,也打算挤点时间再深入钻研以下Functor,感觉这个应用,将来会很广泛,即使java是一个OO语言,是面向状态的命令式编程(Imperative programming)语言。
<!----><o:p> </o:p>
对于Java语言来说,FP并不是其一个特长。但是Functor却是一个很不错的新新亮点,虽然Functor这个概念并不新,早在C++的STL就已经被提出来了:A functor is a function that can be manipulated as an object, or an object representing a single, generic function。—— 透过这个描述,我想我们可以较为这么说:Functor=Function Object。所以,在OO语言中,纯粹的Function是不存在的,在Java语言中,Function也是一个对象,这个对象就是Functor。<o:p></o:p>
但是,在java中,Functor却因为java5对范型(Generic)的支持,终于破土而出,成为一个新新亮点。而我也相信,这个亮点不会只是偶尔的闪烁,必将在未来的很多应用中,显示出璀璨的一面。<o:p></o:p>
<o:p> </o:p>
Functor主要由三种类型:谓词(predicate),函数(function), 过程(procedure)。谓词的计算结果只返回布尔值;函数的计算计算返回一个对象;过程则只负责计算,没有返回结果<o:p></o:p>
<o:p> </o:p>
predicate <o:p></o:p> | return a boolean value<o:p></o:p> |
function <o:p></o:p> | return an Object value<o:p></o:p> |
procedure<o:p></o:p> | don't return anything<o:p></o:p> |
<o:p></o:p>
Functor本身有一元\二元\三元···之分。当然,我对最为常见的就是一元(UnaryPredicate,UnaryFunction,UnaryProcedure)和二元(BinnaryPredicate,BinnaryFunction,BinnaryProcedure)。<o:p></o:p>
<o:p></o:p>
上面都是一些很抽象的概念,那么一个Functor到底什么样子呢?
<o:p> </o:p>
首先让我们来看一个例子,通过这个例子来一步步明白Functor的用处,明白什么是Functor:
<o:p> </o:p>
public static <T> List<T> select(Collection<T> source, UnaryPredicate<T> selector) {<o:p></o:p> List<T> result = new ArrayList<T>();<o:p></o:p> for(T item : source){<o:p></o:p> if( selector.test( item ) ){<o:p></o:p> result.add(item);<o:p></o:p> }<o:p></o:p> }<o:p></o:p> return result; <o:p></o:p> } |
<o:p> </o:p>
这个例子就是Functor的典型应用,利用Functor中的一元谓词,构造了一个select算法。
<o:p>
(未完,待明天继续) writed by 胡长城(银狐999)</o:p>
分享到:
相关推荐
常见的编程范型包括过程式编程、面向对象编程、函数式编程、逻辑编程、并行编程等。《七周七语言》中涉及的编程语言涵盖了这些主要的编程范型,旨在帮助读者拓宽视野,掌握多元化的编程思维方式。 1. **过程式编程*...
1. **函数式编程**:这种编程范型强调计算过程视为函数的组合,避免可变状态和副作用。例如,Haskell 和 Lisp 是典型的函数式语言。通过学习函数式编程,我们可以掌握如何利用高阶函数、纯函数和递归等概念来解决...
2. **函数式编程**:与过程式编程相反,函数式编程强调无副作用和状态不变性。它把计算视为数学函数的应用,避免了变量的修改和副作用。Lisp、Haskell 和 Scheme 是典型的函数式编程语言。函数式编程提倡使用纯函数...
函数式编程关注函数的数学性质,强调无副作用的纯函数,避免状态变化和可变数据。它鼓励使用递归和高阶函数,使得代码可读性高且易于测试。函数式语言如Haskell、Lisp和Scala支持懒求值,可以实现并行计算,提高效率...
Scala是一种多范型编程语言,结合了面向对象和函数式编程的特性。它运行在Java虚拟机上,并能够和现有的Java代码无缝集成。 Erlang是一种专门为大规模并发处理而设计的函数式编程语言。它具有极高的容错性,广泛...
C 语言是一门过程式编程语言,由 Denis Ritchie 和 Ken Thompson 发明于 1970 年。C 语言的特点是使用面向过程的编程范式,使用函数抽象了过程处理。C 语言中,数据常常作为全局的变量保存起来。 C 语言的优点: *...
Java 8引入了Lambda表达式和Stream API,使得函数式编程风格在Java中变得可能。 5. **并行与并发编程**:随着多核处理器的普及,编写能够有效利用多处理器的代码成为必要。Java提供了线程、Executor框架和并发集合...
- **函数式范型**:计算过程被视为一系列数学函数的求值过程。 - **逻辑式范型**:计算过程是为了达成某种逻辑判断而进行的一系列推理活动。 ##### 1.2.2 类型系统 - **分类和构造**:类型系统的构建通常基于一组...
10. **函数式程序设计语言**:介绍λ演算基础,函数式编程范型的特点,如无副作用和不可变数据,以及其在编程中的应用。 11. **逻辑式程序设计语言**:讨论逻辑式编程的基本理念和特点,如Prolog等语言,强调基于...
- **基于对象编程**:在这一范型中,数据和操作数据的函数被封装在一起,形成对象。Ada是支持这种编程风格的语言之一。 - **面向对象编程(OOP)**:OOP引入了类和对象的概念,允许继承和多态性,提高了代码的重用...
D语言是一种多范式的编程语言,支持面向对象、指令式等编程范型。D语言起源于C++,但并非C++的简单扩展或变种,它重新设计了C++的特性并吸收了Java、C#、Eiffel等其他语言的元素。D语言由沃尔特·布莱特(Walter ...
它基于 Java 语言构建,但对语法进行了简化,移除了某些高级特性,使得编程更加直观。尽管如此,Processing 仍然能够充分利用 Java 的性能,例如通过 Java 范型实现高效的代码翻译和执行。 Processing 开发环境...
Java是一种广泛使用的编程语言,在企业应用集成领域有着重要的地位。 #### 2. 利用JNI实现EAI JNI(Java Native Interface)允许Java程序调用本地C/C++代码,从而实现跨平台的企业应用集成。 #### 3. 分布式企业...