一、Lambda表示的用法
二、使用场景:
- 使用Lambda语法创建线程和匿名内部类创建线程的区别
```java
public class Test {
public static void main(String[] args) {
} }// 使用内部类创建线程的方式
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("匿名内部类执行方法体");
}
});
// 使用Lambda表达式创建线程的方式
new Thread(()->{
System.out.println("使用Lambda表达式创建线程");
});
注意:<br />使用Lambda表达式需要函数式编程接口,比如在Runnable接口上可以看到@FunctionalInterface注解(标记着这个接口只有一个抽象方法。函数式编程接口的特点就是:只有一个抽象方法).<br />使用Lambda表达式,要记住两点过:<br />1.Lambda返回的是接口的实例对象。<br />2.有没有参数,参数有多少个,需要不需要有返回值,返回值的类型是啥。选择自己和是的函数式编程接口。
```java
@FunctionalInterface
public interface Runnable {
/**
* When an object implementing interface <code>Runnable</code> is used
* to create a thread, starting the thread causes the object's
* <code>run</code> method to be called in that separately executing
* thread.
* <p>
* The general contract of the method <code>run</code> is that it may
* take any action whatsoever.
*
* @see java.lang.Thread#run()
*/
// 只有一个抽象方法。1
public abstract void run();
}
函数式编程接口介绍:
从上面的例子可以知道,我们使用Lambda表达式创建线程的时候,并不留意接口名称,方法名称,参数名称。我们只关心他的参数类型,参数个数和返回值。
JDK原生就给我们的提供了一些函数式编程接口方便我们去使用。下面是常用的一些接口。(下面表格中的一元接口表示只有一个参数,二元接口表示有两个入参。)
名称 | 一元接口 | 说明 | 二元接口 | 说明 |
---|---|---|---|---|
一般函数 | Function | 一元函数,抽象apply方法。 | BiFunction | 二元函数,抽象apply方法 |
算子函数(输入输出同类型) | UnaryOperator | 一元算子,抽象apply方法 | BinaryOperator | 二元算子,抽象apply方法 |
例子:
import java.util.function.Consumer;
public class Test {
public static void main(String[] args) {
// 一个入参,无返回值
Consumer<String> consumer = s -> System.out.println(s);
consumer.accept("chen");
}
}
方法引用
学习Lambda表示式奇怪的用法:
例如:
public static void main(String[] args) {
// 一个入参,无返回值
Consumer<String> consumer = System.out::println;
consumer.accept("chen");
}
说明:如果函数式接口的实现恰好是可以调用一个方法来实现的,那么可以用到方法引用:
方法引用又分下面三种:
- 静态方法的引用。
- 实例方法的引用。
- 构造函数的方法引用。
例子:
import java.util.function.Consumer;
import java.util.function.Supplier;
public class Test {
public static void main(String[] args) {
// 静态方法引用--通过类名调用
Consumer<String> consumerStatic = Java3y::MyNameStatic;
consumerStatic.accept("3y---static");
//实例方法引用--通过实例调用
Java3y java3y = new Java3y();
Consumer<String> consumer = java3y::myName;
consumer.accept("3y---instance");
// 构造方法方法引用--无参数
Supplier<Java3y> supplier = Java3y::new;
System.out.println(supplier.get());
}
}
class Java3y {
// 静态方法
public static void MyNameStatic(String name) {
System.out.println(name);
}
// 实例方法
public void myName(String name) {
System.out.println(name);
}
// 无参构造方法
public Java3y() {
}
}
总结:
学习Lambda表达式前,首先我们得知道那些常用的函数式编程接口,这些函数式编程接口有什么区别(参数的个数,返回值类型)。
Lambda表达式返回的是【接口对象实例】,【如果函数式接口的实现恰好是可以通过一个方法调用实现的】,那么可以使用方法引用来实现。