【精通函数式编程】(一)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的机器语言,需要不断的适应硬件的更新,这样才能满足程序员的要求。

相关文章
|
21天前
|
安全 Java API
函数式编程在Java中的应用
【4月更文挑战第18天】本文介绍了函数式编程的核心概念,包括不可变性、纯函数、高阶函数和函数组合,并展示了Java 8如何通过Lambda表达式、Stream API、Optional类和函数式接口支持函数式编程。通过实际应用案例,阐述了函数式编程在集合处理、并发编程和错误处理中的应用。结论指出,函数式编程能提升Java代码的质量和可维护性,随着Java语言的演进,函数式特性将更加丰富。
|
29天前
|
Java API 开发者
Java 8新特性之函数式编程实战
【4月更文挑战第9天】本文将深入探讨Java 8的新特性之一——函数式编程,通过实例演示如何运用Lambda表达式、Stream API等技术,提高代码的简洁性和执行效率。
|
2月前
|
Java API
Java中的Lambda表达式和函数式编程
传统的Java编程方式在处理一些简单的逻辑时显得繁琐,而Lambda表达式的引入为我们提供了一种更加简洁、灵活的编程方式。本文将介绍Lambda表达式和函数式编程在Java中的应用以及其与传统编程方式的对比,帮助读者更好地理解并运用这一特性。
8 0
|
2月前
|
JavaScript Java 程序员
Java 8新特性解析:Lambda表达式与函数式编程
【2月更文挑战第12天】 本文深入探讨Java 8引入的两大革命性特性:Lambda表达式和函数式编程接口,旨在为Java开发者提供一个清晰的指南,帮助他们理解和应用这些新特性以提升代码的简洁性和效率。通过对Lambda表达式的基本概念、语法及其与函数式接口的结合使用进行详细分析,本文展示了如何利用这些新特性来编写更加简洁、易读且易于维护的代码。同时,文章还将通过实例探讨Lambda表达式在实际开发中的应用,包括在集合处理、事件监听和并发编程等方面的具体使用场景,以期让读者能够充分理解并有效利用Java 8的这些新工具,从而在日常开发工作中提高效率。
|
3月前
|
Java 编译器
如何在Java中使用Lambda表达式实现函数式编程
Lambda表达式是Java 8中引入的一种新的语法,它可以使我们以更简洁的方式编写函数式代码。本文将介绍如何在Java中使用Lambda表达式实现函数式编程,并通过实例展示其优点。
19 3
|
4月前
|
Java 编译器 API
【Java】lambda表达式,Stream API,函数式编程接口
【Java】lambda表达式,Stream API,函数式编程接口
32 0
|
4月前
|
设计模式 Java 编译器
Java 设计模式最佳实践:一、从面向对象到函数式编程
Java 设计模式最佳实践:一、从面向对象到函数式编程
63 0
|
4月前
|
安全 Java API
Java 编程问题:九、函数式编程——深入研究5
Java 编程问题:九、函数式编程——深入研究
19 1
|
4月前
|
存储 Java 数据库
Java 编程问题:九、函数式编程——深入研究4
Java 编程问题:九、函数式编程——深入研究
29 0
|
4月前
|
存储 Java API
Java 编程问题:九、函数式编程——深入研究3
Java 编程问题:九、函数式编程——深入研究
56 0