概述
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
注意:
- statement仅且只有一行;
- 返回指为function对象;
- 就是简单函数(函数体仅是单行的表达式)的简写版本。
相比函数,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 表达式的返回值定义。
最后
以上就是动听自行车为你收集整理的【lambda表达式】Java/Python/C++看这一篇就够了!的全部内容,希望文章能够帮你解决【lambda表达式】Java/Python/C++看这一篇就够了!所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复