从0到0.1学习 lambda表达式(Java版)

编码几年时间,有一个东西似乎一直也逃不过去,那就是lambda表达式。
无论是c#,Python还是Java,lambda的思想都是共通的。但以下的语法和实例为java。

现在就来说说这个看似很难的lambda表达式

什么是lambda表达式?

lambda表达是实质上就是一个匿名函数
那什么是匿名函数呢?
匿名函数就是没有名字的函数,可以直接嵌入在方法内。里面只包括 函数参数(parameter)+表达式(expression) 或者 函数参数(parameter)+陈述(statements)
PS: 表达式产生值 eg. a+b;2。这两个都属于表达式。 陈述重在操作 比如 if a==b then c=a; c=a+b将xx赋值给xx,或者循环/判断
实际上,陈述也包含了表达式,
因此,我们可以将lambda表达式当成可以输出一个值的函数来使用(把lambda表达式赋给某个值)

语法如下

// no parameter
() -> expression
// one or multi parameters
parameter -> expression
(param1,param2) -> expression
// muiti statements
(param1,param2) -> {
    
     statements }

举个例子(JAVA)

(int x, int y) -> x * y;

lambda表达式解决了什么问题?

偷了一张知乎里大哥的图,此为java语法(java 8及以上)
在这里插入图片描述
可以看到,图中简略了一整个函数的过程。由之前的嵌套代码变成了一行简洁的代码。

进阶 - 与接口一起使用

public class Test
{
    
    
    // 接口FuncInter1中定义了有且仅有一个抽象函数
    interface FuncInter1
    {
    
    
        int operation(int a, int b);
    }
    public static void main(String args[])
    {
    
    
		// 使用lambda表达式的方式实现了FuncInter1接口中的唯一函数
        FuncInter1 add = (int x, int y) -> x + y;

        FuncInter1 multiply = (int x, int y) -> x * y;
        // 使用正常的方式调用接口中的参数即可
        System.out.println("Addition is " + add.operation(2, 3));
        System.out.println("Multiplication is " + multiply.operation(2, 3));
    }
}

当前方式是用lambda表达式实现接口后,用对应接口的对应函数调用lambda表达式从而得到结果,那有没有更简单的方式呢?真的有!

public class Test
{
    
    
    // 依然是原来的接口
    interface FuncInter1
    {
    
    
        int operation(int a, int b);
    }
  	// 将接口中的方法封装起来,这样只需要实现方法及输入参数就可以调用了
    private int operate(int a, int b, FuncInter1 fobj)
    {
    
    
        return fobj.operation(a, b);
    }
  
    public static void main(String args[])
    {
    
    
        FuncInter1 add = (int x, int y) -> x + y;
        FuncInter1 multiply = (int x, int y) -> x * y;

		// 直接掉用封好的函数
        System.out.println("Addition is " + operate(6, 3, add));
        System.out.println("Multiplication is " + operate(6, 3, multiply));

    }
}

参考

  1. 介绍什么statement与expression:https://farside.ph.utexas.edu/teaching/329/lectures/node11.html
  2. Java8-lambda表达式的简单介绍:https://www.geeksforgeeks.org/lambda-expressions-java-8/
  3. 图片来源:https://www.zhihu.com/question/20125256/answer/324121308

猜你喜欢

转载自blog.csdn.net/ptyp222/article/details/115356004
今日推荐