Java lambda表达式
一.简介
Lambda 表达式,也可称为闭包,是一个匿名函数,将行为像数据一样进行传递,也就是变量或者参数都有可能是一段具有功能作用的函数,而不只是数据。
二. 语法
- **可选类型声明:**不需要声明参数类型,编译器可以统一识别参数值。
- **可选的参数圆括号:**一个方法参数无需定义圆括号,但多个参数需要定义圆括号。
- **可选的大括号:**如果主体包含了一个语句,就不需要使用大括号。
- **可选的返回关键字:**如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
三. 作用
-
代替匿名内部类
首先我们来看看示例,通过匿名内部类 ,创建了一个线程。
public class LambdaTest { public static void main(String[] args) { new Thread(new Runnable() { @Override //实现了Runable接口 public void run() { System.out.println("这是一个匿名内部类"); } }).start(); }
但是这还不够简洁,所以使用lambda表达式改写
分析一波:
1. 没有参数 所以只需要一个() 2. 程序知道是那个方法, 无需加“public void run()” 只有一条语句, 所以代码块可以不用 ,去掉{}
public class LambdaTest { public static void main(String[] args) { new Thread(() -> System.out.println("改写成了lambda")).start(); } }
四. 示例
1. 无参数,无返回值
```java
public class LambdaTest {
public static void main(String[] args) {
Runnable runnable = ()->System.out.println("无参数,无返回值");
runnable.run();
}
}
```
2.一个参数, 无返回值
public class LambdaTest {
public static void main(String[] args) {
Demo consumer = s -> System.out.println(s);
consumer.lambda("一个参数,无返回值");
}
}
//定义的接口
@FunctionalInterface
public interface Demo {
public void lambda(String s);
}
3.有多个参数, 有返回值
public class LambdaTest {
public static void main(String[] args) {
Demo consumer = (a ,b) -> {return a + b;} ;
consumer.lambda(1,2);
}
}
//定义的接口
@FunctionalInterface
public interface Demo {
public int lambda(int a , int b );
}
五.函数式接口
Lambda表达式的目标类型必须是“函数式接口(functional interface)”。函数式接口:只包含一个抽象方法的接口。接口可以包含多个默认方法、类方法,但关键是一个抽象方法。所谓函数式接口,指的是只有一个抽象方法的接口。函数式接口可以被隐式转换为Lambda表达式。函数式接口可以用@FunctionalInterface注解标识。
1.自定义函数式接口
//定义的接口
@FunctionalInterface
public interface Demo {
public int lambda(int a , int b );
}
六.方法引用和构造器引用 (::操作符)
方法引用和构造器引用可以让Lambda表达式的代码在简洁的基础上再简洁,使用::双冒号来使用方法引用,看看有几种引用方式:
-
对象::实例方法名
-
类::静态方法名
-
类::实例方法名
import java.util.Arrays; import java.util.List; public class LambdaTest { public static void main(String[] args) { List<String> list = Arrays.asList("aaaa", "bbbb", "cccc"); //静态方法语法 ClassName::methodName list.forEach(LambdaTest::print); System.out.println("======================="); //对象::实例方法名 LambdaTest lambdaTest = new LambdaTest(); list.forEach(lambdaTest::print1); //类::实例方法名 System.out.println("======================="); } public static void print(String content){ System.out.println(content); } public void print1(String content){ System.out.println(content); } }
类构造器语法
public class Example { public static void main(String [] args) { InterfaceExample com = Example::new; Example bean = com.create(); System.out.println(bean); } } interface InterfaceExample{ Example create(); }
到此就介绍完啦!!!