Java中的Lambda表达式、接口

1.Lambda表达式与接口之间的关系

只要Lambda表达式的声明形式与接口相一致,在很多情况下都可以替换接口。见如下代码

Thread t1 = new Thread(new Runnable() {
    public void run() {
        System.out.println("hi");
    }
});
t1.start();

Thread t2 = new Thread(() -> System.out.println("hi"));
t2.start();

t1与t2完成相同的功能。t2中的Lambda表达式() -> System.out.println("hi")Runnable接口中的方法public abstract void run();的形式一样:

  1. 没有返回值。
  2. 没有传入参数。

下面一个例子中

String[] arr = {"111","22","3"};
Arrays.sort(arr,new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        return o1.length()-o2.length();
    }
});

Arrays.sort(arr, (o1,o2)->o1.length()-o2.length());

(o1,o2)->o1.length()-o2.length()的形式与Compartor中public int compare(String o1, String o2)形式也一样:

  1. 两个入参。
  2. 一个返回值,且返回值为int类型。

2.Lambda表达式、匿名内部类与this

Lambda表达式在用法上看起来很像匿名内部类,但其并不是匿名内部类。比如,在以下代码中,在Lambda表达式中不能获得this。

Thread t1 = new Thread(new Runnable() {
    public void run() {
         System.out.println(this);//打印匿名内部类
    }
});
t1.start();

Thread t2 = new Thread(()->{
    //System.out.println(this);//无法编译通过
});
t2.start();

观察如下代码,会发现Lambda表达式中的this与所处环境有关,在这里this是对外部对象的引用。

class Foo{
    Runnable r1 =  ()->{
       System.out.println(this);
    };
    Runnable r2 =  ()->{
        System.out.println(this);
     };
    
    void test(){
        r1.run();
        r2.run();
    }
}
//测试代码如下
Foo foo = new Foo();
System.out.println(foo);
foo.test();

从输出可以看出,输出了三个对象实际上是同一个对象。

Foo@87aac27
Foo@87aac27
Foo@87aac27

3.Lambda、方法引用与函数接口与Stream

猜你喜欢

转载自www.cnblogs.com/zhrb/p/10011744.html