java8中lambda表达式默认方法的模板方法模式,你够了解么?

程序零世界      2022-04-03     555

关键词:

为了以更简单的术语描述模板方法,考虑这个场景:假设在一个工作流系统中,为了完成任务,有4个任务必须以给定的执行顺序执行。在这4个任务中,不同工作流系统的实现可以根据自身情况自定义任务的执行内容。

模板方法可以应用在上述场景中:将工作流系统的4个核心任务封装到抽象类当中,如果任务可以被自定义,则将可自定义的任务推迟到子类中实现。

代码实现:

/** 
 * Abstract Workflow system 
 */
abstract class WorkflowManager2{

    public void doTask1(){

        System.out.println("Doing Task1...");

    }

    public abstract void doTask2();

    public abstract void doTask3();

    public void doTask4(){

        System.out.println("Doing Task4...");

    }

}

/** 
 * One of the extensions of the abstract workflow system 
 */
class WorkflowManager2Impl1 extends WorkflowManager2{

    @Override
    public void doTask2(){

        System.out.println("Doing Task2.1...");

    }

    @Override
    public void doTask3(){

        System.out.println("Doing Task3.1...");

    }

}

/** 
 * Other extension of the abstract workflow system 
 */
class WorkflowManager2Impl2 extends WorkflowManager2{

    @Override
    public void doTask2(){

        System.out.println("Doing Task2.2...");

    }

    @Override
    public void doTask3(){

        System.out.println("Doing Task3.2...");

    }

}

我们来看看工作流系统如何使用:

public class TemplateMethodPattern {

    public static void main(String[] args) {

        initiateWorkFlow(new WorkflowManager2Impl1());

        initiateWorkFlow(new WorkflowManager2Impl2());

    }

    static void initiateWorkFlow(WorkflowManager2 workflowMgr){

        System.out.println("Starting the workflow ... the old way");

        workflowMgr.doTask1();

        workflowMgr.doTask2();

        workflowMgr.doTask3();

        workflowMgr.doTask4();

    }

}

输出如下所示:

Starting the workflow ... the old way

Doing Task1...

Doing Task2.1...

Doing Task3.1...

Doing Task4...

Starting the workflow ... the old way

Doing Task1...

Doing Task2.2...

Doing Task3.2...

Doing Task4...

目前为止一切顺利。但是本篇博客的主要关注点不是模板方法模式,而是如何利用Java 8的Lambda表达式和默认方法实现模板方法模式。我之前已经说过,接口只有在只声明了一个抽象方法的前提下,才可以使用Lambda表达式。这个规则在本篇的例子中应这样解释:WorkflowManager2只能有一个抽象或者说自定义的任务。

我们可以利用带有默认方法的接口替代抽象类,所以我们的新工作流系统如下所示:

interface WorkflowManager{

    public default void doTask1(){

        System.out.println("Doing Task1...");

    }

    public void doTask2();

    public default void doTask3(){

        System.out.println("Doing Task3...");

    }

    public default void doTask4(){

        System.out.println("Doing Task4...");

    }

}

现在我们的工作流系统带有一个可自定义的任务2,我们继续往下走,利用Lambda表达式处理初始化工作:

public class TemplateMethodPatternLambda {

    public static void main(String[] args) {

       /**     
        * Using lambda expression to create different      
        * implementation of the abstract workflow 
        */
        initiateWorkFlow(()->System.out.println("Doing Task2.1..."));

        initiateWorkFlow(()->System.out.println("Doing Task2.2..."));

        initiateWorkFlow(()->System.out.println("Doing Task2.3..."));

    }

    static void initiateWorkFlow(WorkflowManager workflowMgr){

        System.out.println("Starting the workflow ...");

        workflowMgr.doTask1();

        workflowMgr.doTask2();

        workflowMgr.doTask3();

        workflowMgr.doTask4();

    }

}

这就是一个Lambda表达式应用在模板方法模式中的例子。'

最后

想要西厅的学习Java的私信回复 资料
领取一线大厂Java面试题总结+阿里巴巴泰山手册+各知识点学习思维导+一份300页pdf文档的Java核心知识点总结!

这些资料的内容都是面试时面试官必问的知识点,篇章包括了很多知识点,其中包括了有基础知识、Java集合、JVM、多线程并发、spring原理、微服务、Netty 与RPC 、Kafka、日记、设计模式、Java算法、数据库、Zookeeper、分布式缓存、数据结构等等。
file

java8lambda表达式

刚过了春节,来上班,感觉上有些疲乏,劳累。眼睛无法适应长时间盯着屏幕。所以总结一下java8的新特性,lambda用法。功能接口、函数集合、方法引用、interface默认方法默认方法:  java8允许我为接口自身指定实现一个默认... 查看详情

java8之lambda表达式方法引用函数式接口默认方式静态方法(代码片段)

...上这些新的特性的,这篇文章就来聊聊这些新特性。lambda表达式lambda表达式在项目中也是用到了,这种新的语法的加入,对于使用Java多年的我,我觉得是如虎添翼的感觉哈,这种新的语法,大大的改善了以前的Java的代码,变 查看详情

java8—lambda表达式方法引用默认方法的详细介绍一万字(代码片段)

基于Java8详细介绍了lambda表达式的语法与使用,以及方法引用、函数式接口、lambda复合等Java8的新特性!文章目录1Lambda的概述2函数式接口2.1Consumer消费型接口2.2Supplier供给型接口2.3Function<T,R>函数型接口2.4Predicate断言型... 查看详情

java8都有哪些新特性

...方法与静态方法,也就是接口中可以有实现方法二、Lambda表达式三、函数式接口与静态导入四、Lambda作用域在lambda表达式中访问外层作用域和老版本的匿名对象中的方式很相似。你可以直接访问标记了final的外层局部变量,或者... 查看详情

java8新特性--lambda表达式:函数式接口方法的默认实现和静态方法方法引用注解类型推测optional类stream类调用javascriptbase64

文章目录1.Lambda表达式1.1Lambda表达式语法1.2Lambda表达式示例1.3说明:函数式接口2.方法的默认实现和静态方法3.方法引用3.1方法引用示例4.注解(Annotation)5.类型推测6.新增Optional类7.新增Stream类8.调用JavaScript9.Base641.Lambda... 查看详情

java8函数式编程(代码片段)

Lambda表达式函数式接口方法引用与构造器引用StreamAPI接口中的默认方法与静态方法新时间日期API其他新特性速度更快代码更少(增加了新的语法Lambda表达式)强大的StreamAPI便于并行最大化减少空指针异常Optional其中最为核... 查看详情

java8新特征之接口默认方法

...特性。Java8新特性列表如下:接口默认方法函数式接口Lambda表达式方法引用StreamOptional类DateAPIBase64重复注解与类型注解01接口默认方法1、什么是接口默认方法从Java8开始,程序允许在接口中包含带有具体实现的方法 查看详情

学习-jdk8特性(代码片段)

jdk8新特性Lambda表达式Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中。方法引用?方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语... 查看详情

java8新特性总结

Java8Java8新特性新特性讲讲师:李贺飞飞 主要内容1.Lambda表达式2.函数式接口3.方法引用与构造器引用4.StreamAPI5.接口中的默认方法与静态方法6.新时间日期API7.其他新特性 Java8新特性简介.速度更快.代码更少(增加了新的语法Lambda表... 查看详情

java8十大新特性

java8十大新特性如下:1.接口的默认方法2.Lambda表达式3.函数式接口4.方法与构造函数引用5.Lambda作用域6.访问局部变量7.访问对象字段与静态变量8.访问接口的默认方法9.DateAPI10.Annotation注解一、接口的默认方法Java8允许我们给接口添... 查看详情

java8的新特性1

1、lambda表达式2、函数式接口3、StreamAPI4、方法的引用与构造器的引用5、接口中的默认方法与静态方法6、新时间日期API7、其他新特性简介java8的新特性1、速度更快(内存结构、垃圾回收、并行拓展)2、代码更少(新增新的语法l... 查看详情

java8的lambda表达式及方法引用(代码片段)

当前很多公司的java开发环境都升级到jdk8以上了。lambda表达式是java8中最重要的更新,其目的是为了配合随着并行运算流行起来的所谓“函数式”编程改进而来的语法糖。既然是语法糖,那么其实不用这些lambda表达式也是... 查看详情

java8的lambda表达式及方法引用(代码片段)

当前很多公司的java开发环境都升级到jdk8以上了。lambda表达式是java8中最重要的更新,其目的是为了配合随着并行运算流行起来的所谓“函数式”编程改进而来的语法糖。既然是语法糖,那么其实不用这些lambda表达式也是... 查看详情

java8新特性——lambda表达式

其实有规律,总结一下规律就行packagelambda;/*lambda表达式的使用1.举例:()->Integer.compare(o1,o2);2.格式:lambda形参列表(接口中的抽象方法形参列表)->lambda体(重写抽象方法的方法体)3.lambda表达式的使用总结:lambda左边的形参列表... 查看详情

java8新特性之方法引用

...计算时,方法引用会创建函数式接口的一个实例。当Lambda表达式中只是执行一个方法调用时,不用Lambda表达式,直接通过方法引用的形式可读性更高一些。方法引用是一种更简洁易懂的Lambda 查看详情

java8新特性之方法引用

...计算时,方法引用会创建函数式接口的一个实例。当Lambda表达式中只是执行一个方法调用时,不用Lambda表达式,直接通过方法引用的形式可读性更高一些。方法引用是一种更简洁易懂的Lambda 查看详情

java8新特性_sgg

1.Java8新特性_简介Lambda表达式函数式接口方法引用与构造器引用StreamAPI接口中的默认方法与静态方法新时间日期API减少空指针异常的容器 Optional2.Java8新特性_为什么使用Lambda表达式  查看详情

java8方法引用

...在的方法或者构造方法.它需要由兼容的函数式接口(lambda表达式中用到的接口)构成的目标类型上下文.有时候,当我们想要实现一个函数式接口的方法,但是已经由类实现了我们想要的功能,这时可以使用方法引用来直接使用现有的... 查看详情