java lambda表达式

笔记 / 2021-07-06

lambda表达式

什么是lambda表达式?

Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)

lambda表达式作用

优化代码,减少冗余。提升程序健壮性,解放双手,减少患关节炎的概率。

开胃菜

假设我们开辟一个线程,传统写法要写好多行代码,而lambda只需要一行。

传统写法

    @Test
    public void traditionalTest() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName());
            }
        }, "传统写法").start();
    }

lambda写法

    @Test
    public void lambdaTest() {
        new Thread(() -> System.out.println(Thread.currentThread().getName()), "Hello,lambda!").start();
    }

开始学习lambda

学习lambda之前,需要先知道什么是匿名内部类。众所周知在java里是不能直接对接口进行new的。如果我们想这样操作那必须有一个类去实现这个接口,但是不是所有的类我们都要用。如果我们只希望这个类出现一次那么我们可以考虑使用匿名内部类。

Anonymous classes enable you to make your code more concise. They enable you to declare and instantiate a class at the same time. They are like local classes except that they do not have a name. Use them if you need to use a local class only once.

示例代码

 new Thread(new Runnable() {
            @Override
            public void run() {

            }
 });

匿名内部类的使用方法很简单,new InterfaceName() 然后实现接口的方法即可。

lambda表达式要求

  • 依赖函数接口
  • Interface里只能允许一个抽象方法
  • 可以使用@FunctionalInterface标注
@FunctionalInterface
public interface Executable {
    void exec();
}

从匿名内部类到lambda表达式

1. 匿名内部类的写法

        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("doSomething");
            }
        }).start();

2. 只保留方法参数方法体&&参数和方法体之间加上->

        new Thread(()->{
           System.out.println("doSomething");
        }).start();

3. 如果只有一行代码可以去掉 {}

        new Thread(()->System.out.println("doSomething")).start();

三种lambda表达式使用方法

  1. 传统写法

@FunctionalInterface
public interface Executable {
    void exec();
}

public class Executor {

    public static void run(Executable e) {
        e.exec();
    }


    public static void main(String[] args) {
        run(() -> {
            System.out.println("Hello,World!");
        });

    }
}

  1. lambda表达式赋值给接口
public class Executor {

    public static void run(Executable e) {
        e.exec();
    }


    public static void main(String[] args) {
        Executable  executable = ()->{
            System.out.println("Hello,World!");
        };
        executable.exec();
    }
}

  1. 强制类型转换
public class Executor {

    public static void run(Executable e) {
        e.exec();
    }


    public static void main(String[] args) {
        ((Executable)()->{ System.out.println("Hello,World"); }).exec();
    }
}