`
gordonAtJava
  • 浏览: 7996 次
文章分类
社区版块
存档分类
最新评论

在java中小试FP(一)

阅读更多
最近看了点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;
     }
     
}
分享到:
评论
1 楼 gordonAtJava 2008-03-01  
补充以下,http://www.iteye.com/topic/7569 我看的是这个link,有很详尽的介绍,我觉得fp的核心思想还是很启发的

相关推荐

    mongodb在java中小试牛刀

    在Java中使用MongoDB,我们可以借助Spring Data MongoDB框架,它提供了一种简化的方式来操作MongoDB数据库。 首先,让我们了解Spring Data MongoDB的核心概念。Spring Data MongoDB为MongoDB提供了数据访问抽象层,...

    Java Hessian小试(转)

    Java Hessian小试(转) Java Hessian是一种二进制的RPC(远程过程调用)协议,由Caucho公司开发。它旨在提供轻量级、高效的跨语言通信方式,尤其适合于Java与Java之间的通信,但同时也支持与其他语言如Python、C++等...

    Java小试一个播放音乐器

    在编程世界中,Java是一种广泛使用的面向对象的编程语言,以其跨平台的特性深受开发者喜爱。初学者在学习Java的过程中,经常会通过实现一些小型项目来加深对语言的理解和运用。本项目就是一个很好的例子——“Java...

    java画图板小试

    在这个项目中,我们将学习如何使用Java的Swing库来创建一个基本的图形用户界面,让用户能够进行简单的绘图操作。 【描述】这篇博客文章通过一个具体的实例,向读者展示了如何在Java环境中构建一个简单的画图应用。...

    Java HttpInvoker小试(转)

    NULL 博文链接:https://zhuchengzzcc.iteye.com/blog/1534671

    Android 小试牛刀(一)

    Android 小试牛刀1 博文链接:https://huangpengxiao.iteye.com/blog/199497

    java-swing编程小试牛刀之图片查看器

    本文将详细介绍一个基于Java Swing的简易图片查看器的设计与实现过程。该查看器具备基本的图片浏览功能,包括打开文件、切换图片以及关闭文件等操作。通过本项目的实践,读者不仅能加深对Swing组件的理解,还能掌握...

    JSP FileUpload方式上传 一个小试例

    在这个“JSP FileUpload方式上传”的小试例中,我们将探讨如何使用JSP来实现文件上传功能,这是一个在Web开发中常见的需求。 首先,我们要明白文件上传的基本流程。用户在前端通过表单选择要上传的文件,然后提交...

    Java实验指导书 2009

    - 介绍如何在团队项目中使用Java进行协作开发,强调代码规范的重要性。 - 讨论如何使用版本控制系统(如Git)来管理项目的源代码。 **前车之鉴:** - 分析常见的编程错误及其解决方法。 - 学习如何调试程序,使用...

    JExcel / 小试牛刀

    JExcel是一个Java库,它允许开发者在Java应用程序中读取、写入和修改Excel文件,极大地简化了与Excel数据交互的工作。在这个项目中,作者可能通过编写简单的代码示例展示了如何使用JExcel库进行基本操作。 描述中...

    ios hook 小试牛刀(一)

    ios hook 小试牛刀(一)ios hook 小试牛刀(一)ios hook 小试牛刀(一)ios hook 小试牛刀(一)ios hook 小试牛刀(一)ios hook 小试牛刀(一)ios hook 小试牛刀(一)

    JAVA 计算均值

    java 计算均值 小试身手

    通达信指标公式源码 小试牛刀精髓.doc

    本文档《通达信指标公式源码 小试牛刀精髓.doc》主要介绍了如何利用公式进行技术分析,帮助用户在股市中寻找潜在的投资机会。以下是其中涉及的一些关键知识点: 1. **移动平均线(MA)**: - 移动平均线是股票分析...

    用JAVA实现3个数排序

    用JAVA实现的排序额 学JAVA 小试身手

    MVC新手小试牛刀-泡泡堂

    在Java项目中,模型通常包含与数据库交互的DAO(Data Access Object)层,以及业务逻辑处理的Service层。它们处理数据的增删改查,确保数据的正确性和完整性。 2. 视图(View):视图是用户看到和与之交互的界面。...

    JNI技术小试

    在Java中,JNI提供了接口让Java代码能够调用本地(native)代码,通常是C或C++编写的库。这个过程涉及到以下几个主要步骤: 1. **定义本地方法**:在Java类中声明本地方法,方法的实现使用`native`关键字标注。例如...

    小试牛刀代码(用于借鉴)

    在压缩包文件中,"jar"可能包含了一个包含JDBC驱动和其他相关库的Java档案,这些库使得Java程序能够与数据库进行通信。".idea"目录通常是IntelliJ IDEA这样的开发环境的项目配置文件,包含了一些元数据和设置。"JDBC...

    牛刀小试VC

    在《牛刀小试VC》中,读者不仅会学习到理论知识,还将通过一系列实例练习来巩固所学。实践环节是编程学习的关键,通过动手编写代码,可以更好地理解理论并提高编程技能。 总之,《牛刀小试VC》教程是初学者进入VC++...

    java教学课件:第2章 Java小应用.ppt

    在Java编程中,小应用程序(Applet)是一种可以在Web浏览器中运行的轻量级程序。在本章"Java小应用"中,我们将深入探讨Applet的基本概念、生命周期及其在实践中的应用。 2.1 所有小应用程序的根源 Java的小应用程序...

Global site tag (gtag.js) - Google Analytics