一、Lambda表示的用法

语法:()->{}
():方法参数。
{}:方法要实现的内容。

二、使用场景:

  1. 使用Lambda语法创建线程和匿名内部类创建线程的区别 ```java public class Test { public static void main(String[] args) {
    1. // 使用内部类创建线程的方式
    2. new Thread(new Runnable() {
    3. @Override
    4. public void run() {
    5. System.out.println("匿名内部类执行方法体");
    6. }
    7. });
    8. // 使用Lambda表达式创建线程的方式
    9. new Thread(()->{
    10. System.out.println("使用Lambda表达式创建线程");
    11. });
    } }
  1. 注意:<br />使用Lambda表达式需要函数式编程接口,比如在Runnable接口上可以看到@FunctionalInterface注解(标记着这个接口只有一个抽象方法。函数式编程接口的特点就是:只有一个抽象方法).<br />使用Lambda表达式,要记住两点过:<br />1.Lambda返回的是接口的实例对象。<br />2.有没有参数,参数有多少个,需要不需要有返回值,返回值的类型是啥。选择自己和是的函数式编程接口。
  2. ```java
  3. @FunctionalInterface
  4. public interface Runnable {
  5. /**
  6. * When an object implementing interface <code>Runnable</code> is used
  7. * to create a thread, starting the thread causes the object's
  8. * <code>run</code> method to be called in that separately executing
  9. * thread.
  10. * <p>
  11. * The general contract of the method <code>run</code> is that it may
  12. * take any action whatsoever.
  13. *
  14. * @see java.lang.Thread#run()
  15. */
  16. // 只有一个抽象方法。1
  17. public abstract void run();
  18. }

函数式编程接口介绍:

从上面的例子可以知道,我们使用Lambda表达式创建线程的时候,并不留意接口名称,方法名称,参数名称。我们只关心他的参数类型,参数个数和返回值。
JDK原生就给我们的提供了一些函数式编程接口方便我们去使用。下面是常用的一些接口。(下面表格中的一元接口表示只有一个参数,二元接口表示有两个入参。)

名称 一元接口 说明 二元接口 说明
一般函数 Function 一元函数,抽象apply方法。 BiFunction 二元函数,抽象apply方法
算子函数(输入输出同类型) UnaryOperator 一元算子,抽象apply方法 BinaryOperator 二元算子,抽象apply方法

image.png

例子:
image.png

  1. import java.util.function.Consumer;
  2. public class Test {
  3. public static void main(String[] args) {
  4. // 一个入参,无返回值
  5. Consumer<String> consumer = s -> System.out.println(s);
  6. consumer.accept("chen");
  7. }
  8. }

方法引用

学习Lambda表示式奇怪的用法:
例如:

  1. public static void main(String[] args) {
  2. // 一个入参,无返回值
  3. Consumer<String> consumer = System.out::println;
  4. consumer.accept("chen");
  5. }

说明:如果函数式接口的实现恰好是可以调用一个方法来实现的,那么可以用到方法引用:
方法引用又分下面三种:

  • 静态方法的引用。
  • 实例方法的引用。
  • 构造函数的方法引用。

例子:

  1. import java.util.function.Consumer;
  2. import java.util.function.Supplier;
  3. public class Test {
  4. public static void main(String[] args) {
  5. // 静态方法引用--通过类名调用
  6. Consumer<String> consumerStatic = Java3y::MyNameStatic;
  7. consumerStatic.accept("3y---static");
  8. //实例方法引用--通过实例调用
  9. Java3y java3y = new Java3y();
  10. Consumer<String> consumer = java3y::myName;
  11. consumer.accept("3y---instance");
  12. // 构造方法方法引用--无参数
  13. Supplier<Java3y> supplier = Java3y::new;
  14. System.out.println(supplier.get());
  15. }
  16. }
  17. class Java3y {
  18. // 静态方法
  19. public static void MyNameStatic(String name) {
  20. System.out.println(name);
  21. }
  22. // 实例方法
  23. public void myName(String name) {
  24. System.out.println(name);
  25. }
  26. // 无参构造方法
  27. public Java3y() {
  28. }
  29. }

总结:

学习Lambda表达式前,首先我们得知道那些常用的函数式编程接口,这些函数式编程接口有什么区别(参数的个数,返回值类型)。
Lambda表达式返回的是【接口对象实例】,【如果函数式接口的实现恰好是可以通过一个方法调用实现的】,那么可以使用方法引用来实现。