
Lambda表达式
什么是Lambda
Lambda
表达式(也叫 匿名方法 ),是Java8中的一个新特性,意图简化代码流程,使用简易的表达式表示一个方法。
它不仅仅java中有,javascript、python等等均有对应实现。
简单示例(线程启动):
@Test
public void test01() {
// 没有使用 Lambda 的情况下创建线程
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程启动......");
}
}).start();
}
@Test
public void test02() {
new Thread(() -> System.out.println("线程启动......")).start();
}
Lambda语法
每个 Lambda 表达式都遵循以下语法:
(param-list) -> { expression-or-statements }
param-list
:参数列表expression or statements
:表达式
其实就是对应方法的参数和表达式
Lambda使用示例
- 为变量赋值
// Runnable r = () -> { System.out.println("线程启动......");}
Runnable r = () -> System.out.println("线程启动......"); // 如果只有一个语句的话,可以不需要 {}
r.run();
- 作为return结果
static FileFilter getFilter(String ext)
{
return (pathname) -> pathname.toString().endsWith(ext);
}
- 作为数组元素
final PathMatcher[] matchers = {
path -> path.toString().endsWith("txt"), // 同样,如果只有一个参数,可以不需要 ()
path -> path.toString().endsWith("java")
};
- 作为方法参数
new Thread(() -> System.out.println("线程启动......")).start();
lambda作用域
作为匿名方法,lambda不能直接使用方法外的变量,如下:
如果需要在lambda中使用外部变量的话,可以参考以下三种解决方法
变量声明为static
static int a = 10;
@Test
public void test09() {
Runnable r = () -> {
a = 5;
for (int i = 0; i < a; i++) {
System.out.println(i);
}
};
new Thread(r).start();
}
变量声明为AtomicInteger
final AtomicInteger a = new AtomicInteger(10);
new Thread(() -> {
a.set(5);
for (int i = 0; i < a.get(); i++) System.out.println(i);
}).start();
使用数组
使用数组的方式略带一些欺骗的性质,在声明数组的时候设置为 final,但更改 int 的值时却修改的是数组的一个元素。
public class ModifyVariable2ArrayInsideLambda {
public static void main(String[] args) {
final int [] limits = {10};
Runnable r = () -> {
limits[0] = 5;
for (int i = 0; i < limits[0]; i++) {
System.out.println(i);
}
};
new Thread(r).start();
}
}
Lambda和this关键字
Lambda中的this其实指的就是当前类,或者说,Lambda的this指向的对象和所在类对象相同。
如下:
public class LamadaTest {
public static void main(String[] args) {
new LamadaTest().work();
}
public void work() {
System.out.printf("this = %s%n", this);
Runnable r = new Runnable()
{
@Override
public void run()
{
System.out.printf("this = %s%n", this);
}
};
new Thread(r).start();
new Thread(() -> System.out.printf("this = %s%n", this)).start();
}
}
结果为:
this = com.cmower.java_demo.journal.LamadaTest@3feba861
this = com.cmower.java_demo.journal.LamadaTest$1@64f033cb
this = com.cmower.java_demo.journal.LamadaTest@3feba861
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 zxb
评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果