java8 行为参数化

本贴最后更新于 1938 天前,其中的信息可能已经物是人非

本文主要讲 java8 里面的行为参数化部分,可能有点抽象,需要理解

首先,提一个需求,营销发奖,即根据一定的规则,判断该用户是否可以发奖,首先是最基本的定义:

public class PrizeAward {

    /** 用户性别 */
  public enum Sex{
        MAN,WOMAN
  }

  class Person{
        String name;
        Sex gender;

	    public Person(String name,Sex gender){
            this.name=name;
            this.gender=gender;
	    }
  }

  public void award(Person person){
       //如果符合规则,就进行发奖操作
  }
}

说明:

  1. 定义 Person 类,表示待发奖的用户,有两个属性,分别是姓名和性别。
  2. 为了简单表示,将相关的定义都放在发奖类,只是为了展示的需要。
  3. award 方法是真正对外提供服务发奖逻辑,希望它尽可能稳定。

思考:

  1. 发奖的逻辑可能会非常多、非常复杂、非常多变,“多“体现在不同的不同的奖品,可能对应不同的发奖规则,可能根据姓名发奖,可能根据性别发奖,可能根据其他原则发奖;”复杂“体现在发奖内部可能有很多复杂逻辑,例如是否可以重复发,满额消费发奖,长期稳定用户发奖,新注册用户发奖等;”多变“体现在随着业务的发展,随时会有新的发奖逻辑,也随时会撤掉老的发奖逻辑,那么如何完善代码,可能让发奖逻辑尽可能稳定呢?

  2. 在以往写代码的过程中,方法的参数,一般是什么呢?

=>2 在我的认知里,参数一般是数据,无论是是简单的数据 String,int,或者是复杂的数据类型,总之是数据,在方法里面,我们会定义很多的动作,对这些数据进行加工和整合,得到某些结论。例如判断这些数据是真或假,对数据进行排序等。

=>1 为了让 award 方法尽可能稳定,我能想到的方式是将发奖规则存在数据库中,在 award 方法里面从数据库里捞出来规则,然后对参数 Person 进行匹配,因为数据库可以使用后台管理系统,灵活增、减、修改规则,那么 award 方法就会很稳定,无论怎么修改发奖,对外服务的 award 方法基本不变,这种方式相信在工业上是必然可行的,有点复杂,是不是??

还有一种方式,就是将用户匹配这种动作,作为参数传递给 award()方法,所谓发奖规则,无非是判断某用户张三能否发奖,这是一种动作,或者说是行为,行为是”判断“。

先看代码改写:

public class PrizeAward {

    /** 用户性别 */
  public enum Sex{
        MAN,WOMAN
  }

  class Person{
        String name;
        Sex gender;

	    public Person(String name,Sex gender){
           this.name=name;
           this.gender=gender;
	    }
  } 

  public void award(Predicate rule,Person person){
       if (rule.test(person)){
           //发奖
	   }
  }

  Predicate rule1 = (Person person)->{return "ruirui".equals(person.name);};
  Predicate rule2 = (Person person)->{return "MAN".equals(person.gender);};
}

Predicate 是 jdk8 提供的函数式接口之一,其作用是判断,输入一个参数,自己实现某些规则,判断 true or false,非常符合我们这个场景,代码里面我定义了两条规则:

  1. 如果用户名是"ruirui",返回 true
  2. 如果性别是”MAN“,返回 true

请注意,这里依然是示意,规则可能非常多,规则逻辑可能会非常复杂。
最后,将 Predicate作为参数传递给 award()方法,思考一下 Predicate 参数扮演的角色是什么,是一个判断,判断用户 true or false,对比一下 Predicate 参数和 Person 参数的区别,person 仅仅是数据。

Predicate rule1 = (Person person)->{return "ruirui".equals(person.name);};

再单独看这条规则,可不可以认为这是一个函数,有一个输入 person,做了一系列动作,得到一个结论 true or false,函数就是这样子,这也是函数式编程的内在。

jdk8 升级以后,最大的变化是函数式编程,函数式编程只是表象,内里的思想应该是行为参数化,即将行为作为参数,或者说动作作为参数化,扩展了方法参数的内在。

上述例子是行为参数化的例子,行为是判断用户是否符合某发奖条件,可以在揣摩一下。

以上是个人的一些想法,关于函数式编程的学习尚未结束,因此不一定正确,有问题请指正。

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3168 引用 • 8207 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    19 引用 • 23 回帖 • 686 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    76 引用 • 37 回帖
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖 • 5 关注
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    21 引用 • 58 回帖
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 71 关注
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 521 关注
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    45 引用 • 113 回帖 • 314 关注
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    34 引用 • 467 回帖 • 693 关注
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 383 回帖 • 4 关注
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    675 引用 • 535 回帖
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    89 引用 • 113 回帖
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 125 关注
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    198 引用 • 120 回帖
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 41 关注
  • 倾城之链
    23 引用 • 66 回帖 • 102 关注
  • 音乐

    你听到信仰的声音了么?

    59 引用 • 509 回帖
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 181 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 597 关注
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    57 引用 • 22 回帖 • 5 关注
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    103 引用 • 126 回帖 • 448 关注
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 595 关注
  • 招聘

    哪里都缺人,哪里都不缺人。

    189 引用 • 1056 回帖
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 610 关注
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 345 关注
  • GitBook

    GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。

    3 引用 • 8 回帖 • 2 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖 • 2 关注
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖 • 1 关注