【Java】Java8 Function 和 Consumer 接口的使用场景

文章目录

    • 前言
    • 1. Function 示例
    • 2. Function 介绍
    • 3. Consumer 示例
    • 4. Consumer 介绍
    • 5. Function 和 Consumer 接口的使用场景
    • 后记

前言

在 《精通Java8》一书中有讲过 Java8的函数式接口可以简化设计模式的实施,这里记录一下Function 和 Consumer 的使用场景。

1. Function 示例

  • 作为构造方法传入 Funtion 接口实现
// 用 Funtion 声明 iphone 全场9折
Product iphone = new Product("iphone", price -> price.multiply(new BigDecimal("0.9")));
  • 等出现价格后,延迟计算
// 当前商品价格8000, 使用 Funtion 计算
BigDecimal finalPrice = iphone.calFinalPrice(new BigDecimal("8000"));
  • 结果
// 折后7200
assertThat(finalPrice, comparesEqualTo(new BigDecimal("7200")));

2. Function 介绍

JDK介绍,第一个泛型表示输入类型,第二个类型表示输出类型。本文例子中:

  • 输入是原价
  • 输出是经过价格策略处理的现价

在这里插入图片描述
JDK介绍,apply方法接受输入,产生输出。本文例子中:

  • 方法实现就是价格策略
  • 构造方法把策略传入,同样的策略可以多次使用
    在这里插入图片描述
  • 所有代码
public class Product {
    private final String  name;

    /**
     * 价格处理策略
     */
    private final Function<BigDecimal, BigDecimal> function;

    public Product(String name, Function<BigDecimal, BigDecimal> function) {
        this.name = name;
        this.function = function;
    }

    public BigDecimal calFinalPrice(BigDecimal price) {
        return function.apply(price);
    }
}

3. Consumer 示例

在上文的基础上,做一个方法重载

    /**
     * 计算价格前,原价可以被不同系统记录(但是不能修改)
     */
    public BigDecimal calFinalPrice(BigDecimal price, Consumer<BigDecimal> consumer) {
    	// BigDecimal 每次运算都会参数新值,consumer不会影响传入的price
        consumer.accept(price);
        return function.apply(price);
    }
  • 测试
    @Test
    public void test_discount_coupon_save_snapshot() {
        // iphone 全场九折, 并叠加10元优惠
        Product iphone = new Product("iphone", price -> price.multiply(new BigDecimal("0.9")).subtract(BigDecimal.TEN));
        // 原价800, 计算折后, 并保存快照
        BigDecimal finalPrice = iphone.calFinalPrice(new BigDecimal("8000"), price -> saveSnapshot(price));
        // 折后7190
        assertThat(finalPrice, comparesEqualTo(new BigDecimal("7190")));
    }

    private void saveSnapshot(BigDecimal price) {
        // 原价做快照存储,方便溯源
    }

4. Consumer 介绍

JDK介绍,一种避免副作用的函数式接口。
在这里插入图片描述

5. Function 和 Consumer 接口的使用场景

  • Function 用于处理输入并产生输出
  • Consumer 用于处理输入,但是不产生任何副作用
  • 实际情况可以组合使用
  • Function 和 Consumer 如果语义不能满足业务,可以抄Jdk的实现改一下名
    • 本例中 Function 可以换成一个自定义的 PriceStrategy 接口
    • 本例中 Consumer 可以换成一个自定义的 PriceShapshot 接口

后记

函数式是一种编程风格,希望能在业务逻辑中用起来。有更多收获的时候再来总结下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/135386.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker从零开始学习,及常用命令大全(附带代码讲解)

Docker从零开始&#xff0c;及常用命令大全&#xff08;附带代码讲解&#xff09; docker是一种开源的应用容器引擎&#xff0c;可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的Linux机器上&#xff0c;也可以实现虚拟化。…

【集简云调度影刀RPA】

集简云调度影刀 集简云的http请求&#xff0c;都是用webhook。 1、获取token的时候&#xff0c;在url中必须这么填&#xff0c;在数据或者headers里面填写keyID和密码不管用。 2.调起应用的时候&#xff0c;需要选择webhook中的post&#xff0c;自定义的请求&#xff0c;才能…

二叉树的遍历(先序,中序,后序,层序)

目录 1.先序遍历1.代码实现 2.中序遍历1.代码实现 3.后序遍历1.代码实现 4.遍历算法的应用5.层序遍历1.算法思想2.代码实现 6.由遍历序列构造二叉树 1.先序遍历 根左右。 1.代码实现 若二叉树为空&#xff0c;则什么也不做; 若二叉树非空: ①访问根结点; ②先序遍历左子树; ③先…

如何在Linux服务器上后台持久运行Gunicorn

如何在Linux服务器上后台持久运行Gunicorn **问题概述****解决方案一&#xff1a;使用nohup命令****解决方案二&#xff1a;使用systemd服务****创建systemd服务文件****修改systemd服务文件以使用虚拟环境**日志管理**激活并启动服务&#xff1a;**如何设置用户和组**确认用户…

FPGA高端项目:图像采集+GTX+UDP架构,高速接口以太网视频传输,提供2套工程源码加QT上位机源码和技术支持

目录 1、前言免责声明本项目特点 2、相关方案推荐我这里已有的 GT 高速接口解决方案我这里已有的以太网方案 3、设计思路框架设计框图视频源选择OV5640摄像头配置及采集动态彩条视频数据组包GTX 全网最细解读GTX 基本结构GTX 发送和接收处理流程GTX 的参考时钟GTX 发送接口GTX …

在 WSL 上启用 NVIDIA CUDA

环境要求 Windows 11 或 Windows 10 版本 21H2特定版本的GPU驱动&#xff1a; 安装支持 NVIDIA CUDA 的 WSL 驱动程序&#xff1a; https://www.nvidia.com/download/index.aspx具体安装哪个版本&#xff0c;查阅&#xff1a;https://docs.nvidia.com/cuda/wsl-user-guide/in…

基于Python+Django的图书管理系统

项目介绍 图书是人类文明传播的一个重要方式&#xff0c;很多历史悠久的文明都是通过图书来进行传递的&#xff0c;虽然随着时代的进步电子信息技术发展很快&#xff0c;但是纸质图书的地位仍然是非常稳固的&#xff0c;为了能够让知识拥有更加快捷方便的传递方式我们开发了本…

asp.net员工管理系统VS开发sqlserver数据库web结构c#编程包括出差、请假、考勤

一、源码特点 asp.net员工管理系统是一套完善的web设计管理系统&#xff08;主要包括出差、请假、考勤基础业务管理&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010 &#xff0c;数据库为sqlserver2008&a…

postman设置动态token, 每次登录更新token

postman设置动态token, 每次登录更新token 文章目录 postman设置动态token, 每次登录更新token问题1. 设置全局变量2. 新建登录接口3. 设置脚本4. 切换环境5. 配置动态token 问题 token过期时间一般比较短, 每次使用postman调用接口都token非常麻烦 实现token过期后, 调用一次…

Swift 常用类别整理

生成颜色&#xff0c;传入16进制数字生成对应颜色 个人不喜欢传字符串的写法&#xff0c;比如 "0x0080FF" 或者 "0080FF"&#xff0c;原因如下&#xff1a; 传了字符串最后还是要解析成数字参与颜色运算的&#xff0c;需要额外做字符串转数字的操作&…

人工智能领域200例教程专栏—学习人工智能的指南宝典

&#x1f389;&#x1f38a;&#x1f389; 你的技术旅程将在这里启航&#xff01; &#x1f680; 本专栏&#xff1a;人工智能领域200例教程专栏 从基础到实践&#xff0c;深入学习。无论你是初学者还是经验丰富的老手&#xff0c;对于本专栏案例和项目实践都有参考学习意义。 …

Kotlin基础——接口和类

接口 使用 : 表示继承关系&#xff0c;只能继承一个类&#xff0c;但可以实现多个接口override修饰符表示重写可以有默认方法&#xff0c;若父类的默认方法冲突&#xff0c;则需要子类重写&#xff0c;使用super<XXX>.xxx()调用某一父类方法 interface Focusable {fun …

Rt-Thread 移植6--多线程(KF32)

6.1 就绪列表 6.1.1 线程就绪优先级组 线程优先级表的索引对应的线程的优先级。 为了快速的找到线程在线程优先级表的插入和移出的位置&#xff0c;RT-Thread专门设计了一个线程就绪优先级组。线程就绪优先组是一个32位的整型数&#xff0c;每一个位对应一个优先级&#xff…

Spark算子

一、编写spark程序的准备工作&#xff08;程序入口 SparkContext&#xff09; 1.创建SparkConf val conf new SparkConf().setMaster("local[2]").setAppName("hello-app") 2.创建sparkContext val sc: SparkContext new SparkContext(conf) 二、基…

可视化 | echarts饼图改编

echarts模板来源 &#x1f4da;改编点 &#x1f407;基本样式 去掉legend、label&#xff1a;show: false背景透明&#xff1a;backgroundColor: "transparent"去除功能标签添加载入动态animationEasing: elasticOut, animationDelay: function (idx) {return Mat…

Python字符串字母大小写变换

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 说明&#xff1a; 字符串就是一系列字符&#xff0c;在Python中用引号括起来的都是字符串&#xff0c; 引号可以是单引号&#xff0c;也可以是双引号&#xff0…

基于猕猴感觉运动皮层的神经元Spike信号分析

公开数据集中文版详细描述参考前文&#xff1a;https://editor.csdn.net/md/?not_checkout1&spm1011.2124.3001.6192 目录 0. 公开数据集1. 神经元的raster和PSTH图1.1 Raster1.2 PSTH 2. 运动轨迹图 (center_out)3. 神经元的运动调制曲线 (tuning curve) 0. 公开数据集 …

区块链游戏,游戏开发

区块链游戏是一种基于区块链技术的新兴游戏类型&#xff0c;它具有去中心化、安全性高、透明度高、可追溯等特点。与传统的游戏开发相比&#xff0c;区块链游戏开发需要更多的技术和知识储备&#xff0c;同时也需要更加注重游戏本身的玩法和用户体验。 在区块链游戏中&#xff…

Java必刷入门递归题×5(内附详细递归解析图)

目录 1.求N的阶乘 2.求12...N的和 3.顺序打印数字的每一位 4.求数字的每一位之和 5.求斐波拉契数列 1.求N的阶乘 &#xff08;1&#xff09;解析题目意思 比如求5的阶乘&#xff0c;符号表示就是5&#xff01;&#xff1b;所以5&#xff01;5*4*3*2*1我们下面使用简单的…