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

news/2025/2/12 4:04:42/

文章目录

    • 前言
    • 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不会影响传入的priceconsumer.accept(price);return function.apply(price);}
  • 测试
    @Testpublic 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));// 折后7190assertThat(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 接口

后记

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


http://www.ppmy.cn/news/1212673.html

相关文章

Kotlin基础——接口和类

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

深入理解Java中的OutOfMemoryError(OOM)异常

导言&#xff1a; 在Java开发中&#xff0c;我们经常会遇到程序抛出OutOfMemoryError异常的情况&#xff0c;这意味着程序在运行时无法继续分配所需的内存。这篇博客将深入探讨Java中的OOM异常&#xff0c;包括异常的种类、常见的引起OOM的原因以及如何诊断和处理这些问题。 1…

css sprite 的优缺点,使用方法和示例

CSS Sprite是一种网页图片应用处理方式。 CSS Sprite的原理是将一个网页或者一个模块所用到的零碎的icon整合拼接到一张大图里&#xff0c;再把这张大图作为背景图放入到网页中&#xff0c;当访问该页面时&#xff0c;加载的图片就不会像以前那样一幅一幅地慢慢显示出来了。 …

Angular 使用教程——基本语法和双向数据绑定

Angular 是一个应用设计框架与开发平台&#xff0c;旨在创建高效而精致的单页面应用 Angular 是一个基于 TypeScript 构建的开发平台。它包括&#xff1a;一个基于组件的框架&#xff0c;用于构建可伸缩的 Web 应用&#xff0c;一组完美集成的库&#xff0c;涵盖各种功能&…

LeetCode110. Balanced Binary Tree

文章目录 一、题目二、题解 一、题目 Given a binary tree, determine if it is height-balanced . Example 1: Input: root [3,9,20,null,null,15,7] Output: true Example 2: Input: root [1,2,2,3,3,null,null,4,4] Output: false Example 3: Input: root [] Output…

AI:80-基于深度学习的医学图像分割与病变识别

🚀 本文选自专栏:人工智能领域200例教程专栏 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的代码,详细讲解供大家学习,希望可以帮到大家。欢迎订阅支持,正在不断更新中,…

代码随想录算法训练营第四十九天|121. 买卖股票的最佳时机、122. 买卖股票的最佳时机 II

第九章 动态规划part10 121. 买卖股票的最佳时机 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最…

数据可视化PCA与t-SNE

PCA&#xff08;主成分分析&#xff09;和t-SNE&#xff08;t分布随机近邻嵌入&#xff09;都是降维技术&#xff0c;可以用于数据的可视化和特征提取。 降维&#xff1a;把数据或特征的维数降低&#xff0c;其基本作用包括&#xff1a; 提高样本密度&#xff0c;以及使基于欧…