【java8新特性】01:函数式编程及Lambda入门

我们首先需要先了解什么是函数式编程、函数式编程是一种结构化编程范式、类似于数学函数、它关注的重点在于数据操作、或者说它所提倡的思想是做什么,而不是如何去做。

自Jdk8中开始、它也支持函数式编程、函数式编程的关注重点在于参数列表、代码的执行逻辑、将函数以参数的形式进行传递、搭配Jdk8语法糖Lambda闭包能够使得代码更加简化和优雅。

lambda表达式

Lambda表达式是Jdk8推出的语法糖、"可推导即可省略"就是Lambda的核心思想、所谓的可推导即可省略指的是能够通过当前上下文推导出来的内容都可用进行省略、如一些格式化的代码、方法修饰符,数据类型等。

Lambda表达式的基本语法:() -> {}

():方法的参数列表,参数类型可省略,但如果指定一个参数类型后则其他所有参数类型都必须指定参数类型,如果参数列表参数有且只有一个的情况下,连()都能够进行省略。

{}:代码执行逻辑,也就是具体方法所需要执行的代码、当代码片段只有一行或仅有一行返回给调用环境(return)的时候也可以将{}进行省略。

->:Lambda表达式的格式化代码、无法省略、我们可以认为它是一个发送的标识、() ->{} 就是将左侧的参数列表"发送"到右侧代码片段中。

lambda基础语法

public class Main{

    public static void main(String[] args) {
        // 我们单独开一条线程要做某些操作,但又不想单独对线程写个实现类,我们通常可以使用匿名内部类的方式
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(String.format("%s:%s","我是一个匿名内部类的线程",Thread.currentThread().getName()));
            }
        }).start();
        // 以上的匿名内部类实现接口的方式非常常见,但实际上大部分都是没有意义的格式化代码,如果我们使用Lambda表达式进行简化
        new Thread(()->{
            System.out.println(String.format("%s:%s","我是一个lambda的简化的线程",Thread.currentThread().getName()));
        }).start();
        /**
         * 我们发现通过lambda表达式后确实省略了很多代码:
         * new Runnable() 被简化成了 ()
         * @Override public void run() 被简化成了 {}
         * 以上的代码为什么能被Lambda表达式简化呢?
         * 因为Lambda只关注参数列表和执行逻辑(输入和输出),其余的格式化代码它并不关注,所以都是可以进行省略。
         * 但需要注意的并不是所有的代码都能够使用Lambda表达式进行简化的,需要满足以下两个条件:
         * 1.匿名内部类必须是一个接口
         * 2.该接口有且只有一个需要实现的抽象方法
         */
        new Thread(()-> System.out.println(String.format("%s:%s","我是一个lambda简化再简化的线程",Thread.currentThread().getName()))).start();
        //  因为输出只有一行代码,所以连{}都可以省略。
        /**
         * 最终结果:
         * 我是一个匿名内部类的线程:Thread-0
         * 我是一个lambda的简化的线程:Thread-1
         * 我是一个lambda简化再简化的线程:Thread-2
         */
    }
}

 

posted @ 2022-09-18 14:59  请妮妮吃火锅  阅读(78)  评论(0编辑  收藏  举报