JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

Java开发「函数式编程」——Lambda表达式

wys521 2025-02-03 15:42:14 精选教程 25 ℃ 0 评论

今天起,我们来学习Java开发工程师必备技能之『函数式编程』——Lambda表达式。


现在很多小伙伴进入公司或者看到别人代码都在使用函数式编程方式了,代码又简单看得逼格又高。


我们知道JDK8是Java一个重要的更新版本,更新了很多的特性,例如:新增了日期操作类、接口增加静态和默认方法、Lambda 表达式、函数式接口、多重注解、Stream类、Optional空指针处理类等等的特性,而函数式编程就是其中重要的特性,这篇我们先来了解下Lambda 表达式。



Lambda 表达式的引入

回想下我们在学习Java基础的时候,对于如何对接口进行实例化,其中一种方式就是使用匿名内部类的方式了,这样的好处就是不需要我们再定义一个class类实现接口然后重写抽象方法之后去创建class类才能得到接口实例,节省了代码。


如下代码:

new Runnable(){
    @Override
    public void run() {
        System.out.println("匿名内部类实现接口");
    }
};

而Lambda 就是简化它而来的。

1.Lambda 表达式的介绍

Lambda 表达式又称为匿名函数即没有函数名的函数,它的主要目的呢是对接口匿名实现类的一个简化。使用它设计的代码会更加简洁。当开发者在编写Lambda表达式时,也会随之被编译成一个函数式接口。


Lambda 是一个闭包函数,所谓闭包就是指是能够读取其他函数内部变量的函数。例如:A、B两个函数,A函数可以读取到B函数里面的变量,这就是闭包,而通常函数只有内部才能互相访问,所以闭包可以理解为“定义在一个函数内部的函数”。而这个闭包就是函数式编程的思想所在了。


Lambda表达式能够简化的接口中只能有一个抽象方法。这也是我们后面要提到的函数式接口。


2.Lambda 表达式的语法

(paramters) -> {expression};


格式说明:

l (paramters) :表示调用接口的方法。使用有如下特点:

① 如果有参数那么不需要写参数类型,编译器可以统一识别参数值。

例如: (a):表示接口的抽象方法只有一个参数。

(a,b):表示接口的抽象方法有两个参数。

② 如果参数只有一个参数那么()可以省略不写。

l -> :分隔符;

l {} :表示要重写的方法实现,使用有如下特点:

① 如果只有一行代码那么{}也可以省略不写

② 当只有一行代码的时候如果方法有返回值可以不写 return;编译器会自动返回值。


3.Lambda 表达式的使用

public class LambdaDemo {
    public static void main(String[] args) {
        //没有参数的
        A a1 = ()->{ System.out.println("没有参数的lambda表达式"); };
        a1.test();
        //省略了大括号
        A a2 = ()->System.out.println("省略了大括号的");
        a2.test();
        //有一个参数
        Factory f = (pro) ->System.out.println("制造"+pro);
        f.make("汽车");
        //省略了小括号和大括号
        Factory f2 = pro->System.out.println("制造!");
        f2.make("鞋子");
        //有多个参数的
        Calc calc = (a,b)->{return a+b;};
        calc.sum(10,20);
        //省略了return的
        Calc calc2 = (a,b)->a+b;
    }
}
  interface A{
    //无参数
    void test();
}
  interface Factory{
    //一个参数
    void make(String pro);
}
  interface Calc{
    //有参数的
    int sum(int a,int b);
}

Lambda表达式访问外部局部变量问题:

因为Lambda表达式的本质是简化匿名内部类,所以如果想要在Lambda表达式里面访问外部变量的话,外面的局部变量的话必须是final类型的,在JDK1.8之后访问的局部变量可以省略final不写,但是依然是常量不能修改。


例如:

如果对s变量进行修改就不允许:


【未完待续...】

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表