最近看了点functional programming的东西,觉得可以借鉴的地方还不少,所以做了点尝试
就是想把java这样写
从
User user=new User("gordon",28,170);
if(user.getHeight()>160&&user.getName().equals("gordon"){
do something...
}else{
do something else...
}
到
User user=new User("gordon",28,170);
Functor process=taller.than(160).and(matchName.to("gordon")).case(true,someAction,false,otherAction);
process.apply(user);
在java中的fp尝试,可以用已有的程序创造新的程序
package com.gordon;
import java.util.HashMap;
import java.util.Map;
public class Functor {
public Object apply(Object... args){
return null;
}
public Functor and(final Functor... functors){
final Functor first=this;
return new Functor(){
public Object apply(Object... args){
Boolean result=(Boolean)first.apply(args);
for(Functor f : functors){
result=result&&(Boolean)f.apply(args);
}
return result;
}
};
}
public Functor or(final Functor... functors){
final Functor first=this;
return new Functor(){
public Object apply(Object... args){
Boolean result=(Boolean)first.apply(args);
for(Functor f:functors){
result=result||(Boolean)f.apply(args);
}
return result;
}
};
}
public Functor sw(final Map<Object,Functor> switchMap){
final Functor f=this;
return new Functor(){
public Object apply(Object... args){
Object firstResult=f.apply(args);
if(!switchMap.containsKey(firstResult))return args;
return switchMap.get(firstResult).apply(args);
}
};
}
public Functor sw(Object... args){
if(args.length>1&&args.length%2==0){
Map<Object,Functor> sw=new HashMap<Object,Functor>();
for(int i=0;i<args.length;i=i+2){
sw.put(args[i], (Functor)args[i+1]);
}
return this.sw(sw);
}else throw new java.lang.IllegalArgumentException("incorrect number of arguments for Functor.sw , correct format should be (case,Functor,case,Functor...)");
}
public Functor curry(final Object... pargs){
final Functor self=this;
return new Functor(){
public Object apply(Object... args){
Object[] arg=new Object[pargs.length+args.length];
System.arraycopy(pargs, 0, arg, 0, pargs.length);
System.arraycopy(args, 0, arg,pargs.length ,args.length);
return self.apply(arg);
}
};
}
public Functor then(final Functor...functors){
final Functor first=this;
return new Functor(){
public Object apply(Object... args){
Object result=first.apply(args);
for(Functor f:functors){
result=f.apply(result);
}
return result;
}
};
}
public Functor to(final Object... args){
return this.curry(args);
}
public Functor than(final Object... args){
return this.curry(args);
}
public static void main(String args[]) throws Exception{
Functor t=new Functor(){
public Object apply(Object... args){
return true;
}
};
Functor f=new Functor(){
public Object apply(Object... args){
return false;
}
};
Functor trueAction=new Functor(){
public Object apply(Object... args){
System.out.println(""+true+" "+args.length);
return null;
}
};
Functor falseAction=new Functor(){
public Object apply(Object... args){
System.out.println(""+false+" "+args.length);
return null;
}
};
Functor eq=new Functor(){
public Object apply(Object... args){
return args[0].equals(args[1]);
}
};
Functor matchUserName=new Functor(){
public Object apply(Object... args){
return args[0].equals(((User)args[1]).getName());
}
};
Functor matchUserAge=new Functor(){
public Object apply(Object... args){
return args[0].equals(((User)args[1]).getAge());
}
};
Functor taller=new Functor(){
public Object apply(Object... args){
return (Integer)args[0]<((User)args[1]).getHeight();
}
};
User u=new User("gordon",25,173);
Functor eqGordon=eq.to("gordon");
System.out.println(eqGordon.apply("gordon"));
Map<Object,Functor> sw=new HashMap<Object,Functor>();
sw.put(true, trueAction);
sw.put(false, falseAction);
Functor and=t.and(t,t);
Functor or=f.or(f,f,f);
or.sw(true,trueAction,false,falseAction).apply();
matchUserName.to("gordon1").or(matchUserAge.to(26)).or(taller.than(160)).sw(true,trueAction,false,falseAction).apply(u);
}
}
class User{
private String name;
private int age;
private int height;
public User(String name,int age,int height){
this.name=name;
this.age=age;
this.height=height;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
}
分享到:
- 2008-02-29 20:03
- 浏览 1411
- 评论(1)
- 论坛回复 / 浏览 (1 / 2058)
- 查看更多
相关推荐
在Java中使用MongoDB,我们可以借助Spring Data MongoDB框架,它提供了一种简化的方式来操作MongoDB数据库。 首先,让我们了解Spring Data MongoDB的核心概念。Spring Data MongoDB为MongoDB提供了数据访问抽象层,...
Java Hessian小试(转) Java Hessian是一种二进制的RPC(远程过程调用)协议,由Caucho公司开发。它旨在提供轻量级、高效的跨语言通信方式,尤其适合于Java与Java之间的通信,但同时也支持与其他语言如Python、C++等...
在编程世界中,Java是一种广泛使用的面向对象的编程语言,以其跨平台的特性深受开发者喜爱。初学者在学习Java的过程中,经常会通过实现一些小型项目来加深对语言的理解和运用。本项目就是一个很好的例子——“Java...
在这个项目中,我们将学习如何使用Java的Swing库来创建一个基本的图形用户界面,让用户能够进行简单的绘图操作。 【描述】这篇博客文章通过一个具体的实例,向读者展示了如何在Java环境中构建一个简单的画图应用。...
NULL 博文链接:https://zhuchengzzcc.iteye.com/blog/1534671
Android 小试牛刀1 博文链接:https://huangpengxiao.iteye.com/blog/199497
本文将详细介绍一个基于Java Swing的简易图片查看器的设计与实现过程。该查看器具备基本的图片浏览功能,包括打开文件、切换图片以及关闭文件等操作。通过本项目的实践,读者不仅能加深对Swing组件的理解,还能掌握...
在这个“JSP FileUpload方式上传”的小试例中,我们将探讨如何使用JSP来实现文件上传功能,这是一个在Web开发中常见的需求。 首先,我们要明白文件上传的基本流程。用户在前端通过表单选择要上传的文件,然后提交...
- 介绍如何在团队项目中使用Java进行协作开发,强调代码规范的重要性。 - 讨论如何使用版本控制系统(如Git)来管理项目的源代码。 **前车之鉴:** - 分析常见的编程错误及其解决方法。 - 学习如何调试程序,使用...
JExcel是一个Java库,它允许开发者在Java应用程序中读取、写入和修改Excel文件,极大地简化了与Excel数据交互的工作。在这个项目中,作者可能通过编写简单的代码示例展示了如何使用JExcel库进行基本操作。 描述中...
ios hook 小试牛刀(一)ios hook 小试牛刀(一)ios hook 小试牛刀(一)ios hook 小试牛刀(一)ios hook 小试牛刀(一)ios hook 小试牛刀(一)ios hook 小试牛刀(一)
java 计算均值 小试身手
本文档《通达信指标公式源码 小试牛刀精髓.doc》主要介绍了如何利用公式进行技术分析,帮助用户在股市中寻找潜在的投资机会。以下是其中涉及的一些关键知识点: 1. **移动平均线(MA)**: - 移动平均线是股票分析...
用JAVA实现的排序额 学JAVA 小试身手
在Java项目中,模型通常包含与数据库交互的DAO(Data Access Object)层,以及业务逻辑处理的Service层。它们处理数据的增删改查,确保数据的正确性和完整性。 2. 视图(View):视图是用户看到和与之交互的界面。...
在Java中,JNI提供了接口让Java代码能够调用本地(native)代码,通常是C或C++编写的库。这个过程涉及到以下几个主要步骤: 1. **定义本地方法**:在Java类中声明本地方法,方法的实现使用`native`关键字标注。例如...
在压缩包文件中,"jar"可能包含了一个包含JDBC驱动和其他相关库的Java档案,这些库使得Java程序能够与数据库进行通信。".idea"目录通常是IntelliJ IDEA这样的开发环境的项目配置文件,包含了一些元数据和设置。"JDBC...
在《牛刀小试VC》中,读者不仅会学习到理论知识,还将通过一系列实例练习来巩固所学。实践环节是编程学习的关键,通过动手编写代码,可以更好地理解理论并提高编程技能。 总之,《牛刀小试VC》教程是初学者进入VC++...
在Java编程中,小应用程序(Applet)是一种可以在Web浏览器中运行的轻量级程序。在本章"Java小应用"中,我们将深入探讨Applet的基本概念、生命周期及其在实践中的应用。 2.1 所有小应用程序的根源 Java的小应用程序...