java8 行为参数化

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

本文主要讲 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 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    396 引用 • 3416 回帖
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 21 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 427 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    21 引用 • 37 回帖 • 513 关注
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    164 引用 • 594 回帖
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    17 引用 • 236 回帖 • 417 关注
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 407 关注
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    16 引用 • 53 回帖 • 123 关注
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    75 引用 • 145 回帖 • 1 关注
  • Logseq

    Logseq 是一个隐私优先、开源的知识库工具。

    Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.

    4 引用 • 55 回帖 • 7 关注
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    35 引用 • 35 回帖
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 351 关注
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    53 引用 • 85 回帖
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    10 引用 • 54 回帖 • 126 关注
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    124 引用 • 580 回帖
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    22 引用 • 31 回帖 • 2 关注
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    148 引用 • 257 回帖
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 618 关注
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 643 关注
  • 大数据

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

    89 引用 • 113 回帖
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 38 关注
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    710 引用 • 1173 回帖 • 171 关注
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 370 关注