什么是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使用示例

  1. 为变量赋值
// Runnable r = () -> { System.out.println("线程启动......");}
Runnable r = () -> System.out.println("线程启动......"); // 如果只有一个语句的话,可以不需要 {}
r.run();
  1. 作为return结果
static FileFilter getFilter(String ext)
{
    return (pathname) -> pathname.toString().endsWith(ext);
}
  1. 作为数组元素
final PathMatcher[] matchers = {
                path -> path.toString().endsWith("txt"), // 同样,如果只有一个参数,可以不需要 ()
                path -> path.toString().endsWith("java")
        };
  1. 作为方法参数
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