【lambda表达式】Java/Python/C++看这一篇就够了!

Java Lambda 表达式

简介

lambda表达式(闭包),允许把函数作为一个方法的参数,其作为最重要的新特性随Java 8一同发布。熟练使用lambda表达式能够简化开发,使代码更简洁紧凑。

java下,使用lambda表达式的一般步骤:

public class Test{
    public static void main(String[] args) {
		//2、lambda表达式创建对象
        Demo demo = (a, b) -> a + b;
        //3、通过对象调用方法
        System.out.println(demo.add(1, 1));
    }
}
//1、提供函数式接口
interface Demo{
    int add(int num1, int num2);
};

探究

java的lambda表达式相当依赖函数式接口,这与其简化开发的演化相关。
函数式接口,简单来说指,有且仅有一个方法的接口。详细介绍可参考这里。

当我们需要实现某一功能时,通常通过定义接口并创建其实现类来实现:

public class Test{
    public static void main(String[] args) {
        //创建实例
        Demo demo = new DemoImpl();
        System.out.println(demo.add(1, 1));
    }
}
//接口实现类
class DemoImpl implements Demo{

    @Override
    public int add(int num1, int num2) {
        return num1 + num2;
    }
}

//定义接口
interface Demo{
    int add(int num1, int num2);
};

若方法使用场景很少,甚至说仅使用一次,可以考虑静态内部类

public class Test{
    //静态内部类
    static class DemoImpl implements Demo{

        @Override
        public int add(int num1, int num2) {
            return num1 + num2;
        }
    }

    public static void main(String[] args) {
        //创建实例
        Demo demo = new DemoImpl();
        System.out.println(demo.add(1, 1));
    }
}

//定义接口
interface Demo{
    int add(int num1, int num2);
};

进一步,懒得甚至不想跑出方法体外定义类,此时考虑局部内部类

public class Test{
    public static void main(String[] args) {
        //局部内部类
        class DemoImpl implements Demo{

            @Override
            public int add(int num1, int num2) {
                return num1 + num2;
            }
        }

        //创建实例
        Demo demo = new DemoImpl();
        System.out.println(demo.add(1, 1));
    }
}

//定义接口
interface Demo{
    int add(int num1, int num2);
};

还是嫌麻烦,可不可以不去专门定义类,就想直接创建对象调方法。能!匿名内部类考虑一下:

public class Test{
    public static void main(String[] args) {
        //通过匿名内部类,创建实例对象
        Demo demo = new Demo() {
            @Override
            public int add(int num1, int num2) {
                return num1 + num2;
            }
        };
        System.out.println(demo.add(1, 1));
    }
}

//定义接口
interface Demo{
    int add(int num1, int num2);
};

能不能在简洁一些。能!lambda表达式这不就来了嘛:

public class Test{
    public static void main(String[] args) {
		//2、lambda表达式创建对象
        Demo demo = (a, b) -> a + b;
        //3、通过对象调用方法
        System.out.println(demo.add(1, 1));
    }
}
//1、提供函数式接口
interface Demo{
    int add(int num1, int num2);
};

都已经这么简单了,那可不可以把接口一并优化掉呢?不能!使用lambda表示式的大前提就是函数式接口,但java给我们提供了相关工具类,内置了四种常用接口,方便我们使用lambda表达式。参考连接

总结

  • 其实质属于函数式编程的概念,简单语法:(parameter) -> {statements}
  • 避免匿名内部类的定义过多;
  • 使代码更简洁紧凑;
  • 去掉大量无意义代码,只保留核心逻辑;
  • 常见使用案列new Thread(()->System.out.println("我是通过lambda创建的Runable实例对象!!!"))
  • 需要函数式接口的定义。

Python Lambda 表达式

简介

Python–lambda 表达式,又称匿名函数,与java的lambda表达式不同的是,python的lambda表达式不在要求函数式接口的定义(python也没有interface的概念–!),但其要求函数体内部有且只有一行表示式!其返回值不再是实例对象,而是function对象。下面给出简单的使用方法,更多可参考这里。

#普通函数定义
def add(num1, num2):
    return num1 + num2
print(add(1,1))
#lambda表达式
add = lambda num1,num2:num1 + num2 #注意:只能有一行表达式即(num1 + num2)
print(add(1,1))

概要

语法:lambda [parameters] : statement
注意:

  1. statement仅且只有一行;
  2. 返回指为function对象;
  3. 就是简单函数(函数体仅是单行的表达式)的简写版本。

相比函数,lamba 表达式具有以下 2 个优势:

  • 对于单行函数,使用 lambda 表达式可以省去定义函数的过程,让代码更加简洁;
  • 对于不需要多次复用的函数,使用 lambda 表达式可以在用完之后立即释放,提高程序执行的性能。

C++ Lambda 表达式

简介

在C# 3.5 和 Java 8 中引入 lambda 表达式之后,C++11 这次把 lambda 作为最重要也最常用的一个特性之一加进来了。相较于java和python,C++的lambda表达式没有严苛的限制条件,其不需要函数式接口的定义,没有限制方法体内表达式的数量。仅作为仿函数(函数对象)的便捷创建方式,被广泛使用。避免了代码膨胀和功能分散,使开发者更加集中精力在手边的问题。推荐参考

概要

  • 常用语法:[capture] (parameters) {body;};
  • [capture]捕获列表,[] 不捕获任何变量,[&] 捕获外部作用域中所有变量,按引用捕获,[=] 捕获外部作用域中所有变量,按值捕获;
  • (parameters)参数列表,lambda 表达式在没有参数列表时,参数列表是可以省略;
  • body,函数体,编译器会根据 return 语句自动推导出返回值类型,所以允许省略 lambda 表达式的返回值定义。

你可能感兴趣的:(零基础学Java,java,c++,python)