一、概述
Lambda是JDK8中一个语法糖。他可以对某些匿名内部类(接口中只有一个抽象方法) 的写法进行简化。它是函数式编程思想的一个重要体现。让我们不用关注是什么对象。而是更关注我们对数据进行了什么操作。
二、核心原则
可推导可省略
三、基本格式
(参数列表)->{代码}
四、案例
4.1
我们在创建线程并启动时可以使用匿名内部类的写法:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(111);
}
});
可以使用Lambda的格式对其进行修改。修改后如下:
new Thread(()->{
});
4.2
现有方法定义如下,其中IntBinaryOperator是一个接口。先使用匿名内部类的写法调用该方法。
public static int calculateNum(IntBinaryOperator operator){
int a = 10;
int b = 20;
return operator.applyAsInt(a, b);
}
public static void main(String[] args) {
int cal = calculateNum(new IntBinaryOperator() {
@Override
public int applyAsInt(int left, int right) {
return left + right;
}
});
System.out.println(cal);
}
Lambda写法:
public static int calculateNum(IntBinaryOperator operator){
int a = 10;
int b = 20;
return operator.applyAsInt(a, b);
}
public static void main(String[] args) {
int cal = calculateNum((int left, int right)->{
return left + right;
});
System.out.println(cal);
}
最简格式:
int cal = calculateNum((left, right)-> left + right);
4.3
现有方法定义如下,其中IntPredicate是一个接口。先使用匿名内部类的写法调用该方法。
public static void printNum(IntPredicate predicate){
int[] arr = {1,2,3,4,5,6,7,8,9,10};
for (int i : arr) {
if(predicate.test(i)){
System.out.println(i);
}
}
}
public static void main(String[] args) {
printNum(new IntPredicate() {
@Override
public boolean test(int value) {
return value % 2 == 0;
}
});
}
Lambda写法:
public static void printNum(IntPredicate predicate){
int[] arr = {1,2,3,4,5,6,7,8,9,10};
for (int i : arr) {
if(predicate.test(i)){
System.out.println(i);
}
}
}
public static void main(String[] args) {
printNum((int value) -> {
return value % 2 == 0;
});
}
最简格式:
printNum(value-> value % 2 == 0);
4.4
现有方法定义如下,其中Function是一个接口。先使用匿名内部类的写法调用该方法。
public static <R> R typeConver(Function<String,R> function){
String str = "1235";
R result = function.apply(str);
return result;
}
public static void main(String[] args) {
Integer result = typeConver(new Function<String, Integer>() {
@Override
public Integer apply(String s) {
return Integer.valueOf(s);
}
});
System.out.println(result);
}
Lambda写法:
public static <R> R typeConver(Function<String,R> function){
String str = "1235";
R result = function.apply(str);
return result;
}
public static void main(String[] args) {
Integer result = typeConver((String s) -> {
return Integer.valueOf(s);
});
System.out.println(result);
}
最简格式:
Integer result = typeConver(s -> Integer.valueOf(s));
4.5
现有方法定义如下,其中IntConsumer是一个接口。先使用匿名内部类的写法调用该方法。
public static void foreachArr(IntConsumer consumer){
int[] arr = {1,2,3,4,5,6,7,8,9,10};
for (int i : arr) {
consumer.accept(i);
}
}
public static void main(String[] args) {
foreachArr(new IntConsumer() {
@Override
public void accept(int value) {
System.out.println(value);
}
});
}
Lambda写法:
public static void foreachArr(IntConsumer consumer){
int[] arr = {1,2,3,4,5,6,7,8,9,10};
for (int i : arr) {
consumer.accept(i);
}
}
public static void main(String[] args) {
foreachArr((int value) -> {
System.out.println(value);
});
}
最简格式:
foreachArr(value -> System.out.println(value));
五、省略规则
-
参数类型可以省略int、String等
-
方法体只有一句代码时 大括号、return、和唯一一句代码的分号可以省略 (同时省略)
-
方法只有一个参数时小括号可以省略、同时参数类型也要省略
-
以上这些规则都记不住也可以省略不记-- (alt + 回车)生成最简格式