Lambda表达式的核心思想是 不用关注是什么对象,而是更关注我们对数据进行了什么操作
implements
是 Java 中的关键字,用于表示一个类实现了一个接口的所有方法。当一个类实现了一个接口,它需要提供该接口中定义的所有抽象方法的具体实现。
@FunctionalInterface
interface Calculator {
int calculate(int a, int b);
}
public class Addition implements Calculator {
@Override
public int calculate(int a, int b) {
return a + b;
}
}
public class Multiplication implements Calculator {
@Override
public int calculate(int a, int b) {
return a * b;
}
}
public class Main {
public static void main(String[] args) {
Calculator addition = new Addition();
System.out.println("Sum: " + addition.calculate(5, 3));
Calculator multiplication = new Multiplication();
System.out.println("Product: " + multiplication.calculate(4, 2));
}
}
@FunctionalInterface
interface MyFunctionalInterface {
int performOperation(int a, int b);
}
public class Main {
public static void main(String[] args) {
MyFunctionalInterface addition = (a, b) -> a + b;
System.out.println("Sum: " + addition.performOperation(5, 3));
MyFunctionalInterface multiplication = (a, b) -> a * b;
System.out.println("Product: " + multiplication.performOperation(4, 2));
}
}
在这个示例中,MyFunctionalInterface 是一个函数式接口,它定义了一个抽象方法 performOperation。我们通过Lambda表达式分别创建了加法和乘法的实现,并通过调用 performOperation 方法来执行这些操作。
总之,函数式接口中的抽象方法是可以被实现类重写的,这是实现函数式编程特性的基本要求。
我们在创建线程并启动时可以使用匿名内部类的写法:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("你知道吗 我比你想象的 更想在你身边");
}
}).start();
可以使用Lambda的格式对其进行修改。修改后如下:
new Thread(()->{
System.out.println("你知道吗 我比你想象的 更想在你身边");
}).start();
Lambda表达式在Java中是通过上下文中的目标类型(Target Typing)来进行类型推断的。在这个例子中,Lambda表达式是如何知道创建的是Runnable
的实例呢?
在创建线程的构造函数中,传递了一个Lambda表达式作为参数,这个Lambda表达式的参数和返回类型必须与目标上下文的类型匹配。换句话说,Java 编译器会根据上下文推断出Lambda表达式的类型。
Thread
构造函数的参数类型要求是一个实现了 Runnable
接口的对象。这个构造函数允许将一个 Runnable
对象作为参数传递,以便在新的线程中执行 Runnable
对象的 run
方法。
具体来说,Thread
类有以下两个构造函数可以接受 Runnable
参数:
-
Thread(Runnable target)
- 用于创建一个新的线程,该线程将执行传递的
Runnable
对象的run
方法。
- 用于创建一个新的线程,该线程将执行传递的
-
Thread(Runnable target, String name)
- 除了接受
Runnable
参数外,还可以指定线程的名称。
- 除了接受
所以,当提供一个 Lambda 表达式作为参数时,根据 Lambda 表达式的实际内容,编译器会自动推断出 Runnable
类型,以满足 Thread
构造函数对参数类型的要求。
省略规则
-
参数类型可以省略
-
方法体只有一句代码时大括号return和唯一一句代码的分号可以省略
-
方法只有一个参数时小括号可以省略
-
以上这些规则都记不住也可以省略不记
还有一句话 括号中记录的是接口中方法的参数,代码块中是方法体内容