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 表达式,又称匿名函数,与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
注意:
相比函数,lamba 表达式具有以下 2 个优势:
在C# 3.5 和 Java 8 中引入 lambda 表达式之后,C++11 这次把 lambda 作为最重要也最常用的一个特性之一加进来了。相较于java和python,C++的lambda表达式没有严苛的限制条件,其不需要函数式接口的定义,没有限制方法体内表达式的数量。仅作为仿函数(函数对象)的便捷创建方式,被广泛使用。避免了代码膨胀和功能分散,使开发者更加集中精力在手边的问题。推荐参考
[capture] (parameters) {body;};