【精通函数式编程】(一)Java演变与函数式编程

简介: Java8函数式编程实战开篇暴击,电商多重优惠核销代码初探

image.png

前言:

📫 作者简介:小明java问道之路,专注于研究计算机底层,就职于金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的设计和架构📫

🏆 Java领域优质创作者、阿里云专家博主、华为云享专家🏆

🔥 如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主哦

本文导读

本文导读为什么要学函数式编程(java高版本的特性)呢?主要有两点:一是、现在不管大还是中小企业多数使用8或以上版本的jdk包(笔者写此文的时候jdk已经到18了),生产代码会有很多8/11以及以上的新特性(比如lambda表达式、Stream流、函数式接口)等等,如果你不了解,那么项目里面的代码就看不懂,更无法完成工作;二是,无论是Spring源码还是JIT的一些新版本的源码,里面大量使用了Java8以上的新特性,如果还不懂Java8的话,未来源码解析对你来说根本不知道源码这么做的意图。

学什么东西?Lambda表达式、方法引用、StreamAPI、CollectionAPI、DSL(领域特定语言 domain-specific language)譬如Comparator、Collector、Optional类、Local…等时间API、CompletableFuture、反应式编程、函数式编程技巧和工程中的实例

一、函数式编程思想

首先函数式编程是思想也是一种概念,他是一种新的编程风格,更关注对数据进行什么操作,函数式编程的核心是把函数作为值(例如方法参数中的lambda表达式、Stream中输出流可能是下一方法的输入流),我们可以把他理解为一种设计模式和语法,可以更少的时间,编写更清晰更简洁的代码

二、浅尝java的变化

1、函数式编程是种新的编程模式,那什么是函数,在我们代码中函数通常指的是 方法,java8中新增了函数作为值(这个值是这么理解的,方法定义类,类可以实例化产生值,但是不管是方法还是类本身都不是值,java8将方法(函数)本身变成了值)

/**
 * 电商业务中有很多优惠信息,例如红包、平台券、商家券、满减、秒杀活动等等
 * 如果每个优惠写一个方法那么就不方便阅读和管理,我们可以用这种方式将代码扩展性做的很好
 */
public void writeOff(List<OrderInfo> orderList, Consumer<List<CouponInfo>> consumer) {
    List<CouponInfo> couponInfos = consume(orderList); // 每个优惠信息,由自己的实现类实现
    System.out.println("核销优惠信息"); 
    // 此处将结果保存
    consumer.accept(couponInfos);
}
/**
 * 假设为下单主流程
 */
public void submitOrder(List<OrderInfo> orderList) {
    Test test = new Test();
    test.writeOff(orderList, couponInfos -> { System.out.println("入库"); });
}
/**
 * 执行结果为:核销优惠信息 ->入库
 */
public static void main(String[] args) {
    Test test = new Test();
    test.submitOrder(new ArrayList<>());
}

执行结果为:

image.png

2、把方法作为值来传递显然是有用简介的,但是类似于嵌套、循环、筛选这类的工具方法java8引入了匿名函数或Lambda,从而不需要定义方法就可以将函数处理

public static void main(String[] args) {
    Test test = new Test();
    List<OrderInfo> orderList = new ArrayList<>();
    test.transaction(orderList);
}
/**
 * 将大于10的订单组成一个哈希表
 */
private void transaction(List<OrderInfo> orderList) {
    Map<String, OrderInfo> orderInfoMap = new HashMap<>();
    for (OrderInfo orderInfo : orderList) {
        if (orderInfo.getOrderAmt().compareTo(BigDecimal.TEN) > 0) {
            orderInfoMap.put(orderInfo.getOrderId(), orderInfo);
        }
    }
    Map<String, OrderInfo> collect = orderList.stream().filter(orderInfo -> orderInfo.getOrderAmt().compareTo(BigDecimal.TEN) > 0)
            .collect(Collectors.toMap(OrderInfo::getOrderId, Function.identity()));
}

3、java处理多线程并发(Thread)在7之前,如果你的代码有反复的处理,你可能或有Thread或者Runnable进行多线程处理,在java8只有使用StreamAPI解决了集合中处理时没有多线程和模板。

image.png

三、语言的改变和硬件相关

我们大致了解java8的代码发生了什么变化之后,那我们思考为什么要变化?同时为什么java的版本变得越变越快?

现在新的计算机都是多核的,不仅仅有一个CPU(核、处理器),而java程序如果只利用其中一个核的话其他的核就浪费了,所以java8提供了新的编程风格,这样可以更好的配合计算机工作,于此同时go、PyThon等语言层出不穷,java需要保持自己的竞争力。

语言需要不断改进,因为底层好需要编译编器去编译成汇编语言执行,汇编语言也是不断变化的,例如现在RISC和CISC两大指令集,在不断变化,而汇编器去操作汇编将其转化为0101的机器语言,需要不断的适应硬件的更新,这样才能满足程序员的要求。

相关文章
|
2月前
|
Java
Java8函数式编程
Java8函数式编程
29 2
|
4月前
|
Java 程序员 API
解锁Java新纪元:Lambda表达式——让你的代码秒变高大上,函数式编程不再是梦!
【8月更文挑战第25天】Java 8 推出了革命性的 Lambda 表达式特性,这是一种匿名函数形式,支持任意数量参数及返回值,简化了代码编写。其基本语法为 `(parameters) -&gt; expression` 或 `(parameters) -&gt; { statements; }`。例如,遍历集合可从使用匿名内部类变为简洁的 `names.forEach(name -&gt; System.out.println(name))`。
58 0
|
28天前
|
Java API
Java中的Lambda表达式与函数式编程####
【10月更文挑战第29天】 本文将深入探讨Java中Lambda表达式的实现及其在函数式编程中的应用。通过对比传统方法,我们将揭示Lambda如何简化代码、提高可读性和维护性。文章还将展示一些实际案例,帮助读者更好地理解和应用Lambda表达式。 ####
|
29天前
|
分布式计算 Java API
Java 8引入了流处理和函数式编程两大新特性
Java 8引入了流处理和函数式编程两大新特性。流处理提供了一种声明式的数据处理方式,使代码更简洁易读;函数式编程通过Lambda表达式和函数式接口,简化了代码书写,提高了灵活性。此外,Java 8还引入了Optional类、新的日期时间API等,进一步增强了编程能力。这些新特性使开发者能够编写更高效、更清晰的代码。
31 4
|
1月前
|
Java API 开发者
Java中的Lambda表达式与函数式编程####
在Java的演变过程中,Lambda表达式和函数式编程的引入无疑是一次重大的飞跃。本文将深入探讨Lambda表达式的定义、用法及优势,并结合实例说明如何在Java中利用Lambda表达式进行函数式编程。通过对比传统编程方式,揭示Lambda表达式如何简化代码、提高开发效率和可维护性。 ####
|
2月前
|
Java
让星星⭐月亮告诉你,jdk1.8 Java函数式编程示例:Lambda函数/方法引用/4种内建函数式接口(功能性-/消费型/供给型/断言型)
本示例展示了Java中函数式接口的使用,包括自定义和内置的函数式接口。通过方法引用,实现对字符串操作如转换大写、数值转换等,并演示了Function、Consumer、Supplier及Predicate四种主要内置函数式接口的应用。
28 1
|
3月前
|
并行计算 Java 测试技术
探索Java中的函数式编程
在本文中,我们将深入探讨Java中的函数式编程。我们会先了解什么是函数式编程以及为什么它如此重要。然后,通过一些简单的代码示例,展示如何在Java中应用函数式编程概念。最后,讨论在实际项目中如何利用函数式编程来提高代码的可读性和效率。
34 7
|
3月前
|
Java API 开发者
探索Java中的函数式编程
本文深入探讨了Java中的函数式编程,这是一种强调使用不可变数据和避免共享状态的编程范式。我们将从基础概念、核心特性以及实际应用案例三个方面,全面解析函数式编程在Java中的魅力和价值。
|
3月前
|
Java C语言
5-13|Java的函数式编程
5-13|Java的函数式编程
|
4月前
|
并行计算 Java 大数据
Java函数式编程:一场编程范式的革命,让你的代码焕发新生!
【8月更文挑战第30天】Java函数式编程是一种基于数学函数理论的编程范式,强调数据处理的不可变性和纯函数使用,通过将函数视为第一类对象,实现更简洁、易读的代码结构,在数据流处理与并行计算中尤为突出。与命令式编程关注执行步骤不同,函数式编程侧重描述计算目标而非具体操作流程,减少了状态变化,使代码更清晰易维护。在Java中,函数式编程通过降低副作用和状态依赖简化了复杂度,并提高了代码质量和测试性,尤其是在Java 8的Stream API中得到了充分体现,能够自动优化多核处理器上的并行处理性能。
62 2