一、前言
Lambda表达式是Java8开始出现的新特性,相信现在应该有很多小伙伴用着Java8+版本,写的却是Java7的代码。接下来我们就一起开启Lambda的学习吧!
二、你要懂的几个概念
- 什么是接口默认方法?
使用default关键字在接口中添加方法实现,如下代码:
public interface IDefaultMethod {
default void printDefault() {
System.out.println("Hello default method");
}
}
// test
void testDefaultMethod() {
IDefaultMethod iDefaultMethod = new IDefaultMethod() {};
iDefaultMethod.printDefault();
}
- 什么是函数式接口?
有且仅有一个抽象方法声明的接口(但接口可以有多个默认方法),当然为了让编译器能够识别,更建议你在接口上增加
@FunctionalInterface
用以标记(非必须使用,但是强烈建议标注),此时添加编译器则会给出报错提示,函数式接口如下:
@FunctionalInterface
public interface IFunctionalMethod {
void helloWord();
default void printDefault() {
System.out.println("Hello default method");
}
default void printDefaultJava() {
System.out.println("Hello default java");
}
}
// test
public void test(){
IFunctionalMethod iFunctionalMethod = new IFunctionalMethod() {
@Override
public void helloWord() {
System.out.println("impl hello word");
}
};
iFunctionalMethod.helloWord();
iFunctionalMethod.printDefault();
iFunctionalMethod.printDefaultJava();
}
- 什么是Lambda表达式?
- 是一个匿名函数,可以当作参数传递;
需要注意的是,lambda并不是任何地方都可以使用,需要特定的函数式接口进行匹配。
如果你正在使用idea进行开发,你会发现在IFunctionalMethod的测试代码部分我们声明的函数,idea会建议我们Replace with lambda, 如下图:
调整后的lambda代码如下:
public void testLambda(){
IFunctionalMethod iFunctionalMethod = () -> System.out.println("impl hello word");
iFunctionalMethod.helloWord();
iFunctionalMethod.printDefault();
iFunctionalMethod.printDefaultJava();
}
通过上面几个基础概念和简单的例子演示,我们可以看出Lambda让代码更加简洁、紧凑,接下来我们趁着打铁,赶快看看Lambda更多的骚操作!
三、Lambda表达式语法结构
任何一种语法都有它的使用规则,Lambda当然也不例外,我们来看看Lambda的语法结构:
(参数列表) -> {方法体}
参数列表对应的是抽象方法的参数,箭头 “->” 是固定位置的固定写法将参数和方法体之间,方法体即Lambda主体对应的是抽象方法的实现。
- 案例
public interface LambdaExample {
String helloLambda(String param);
}
// test
LambdaExample lambdaExample = (String param) -> {
System.out.println("第一个lambda语法展示");
return param;
};
四、Lambda语法其他场景实践
通常我们在实际使用Lambda的时候会基于语法结构进行一系列的简化操作(总而言之,能少写点就少写点)
- 参数类型可以省略
LambdaExample lambdaExample = (param) -> {
System.out.println("第二个lambda语法展示");
return param;
};
- 抽象方法参数只有一个,可以去掉参数的括号,如果是多个参数不允许哦!
LambdaExample lambdaExample = param -> {
System.out.println("第三个lambda语法展示");
return param;
};
- 如果方法体只有一行代码如下
LambdaExample lambdaExample = param -> { return param; };
// 可以将方法体的{}也省略,如果有返回值,那么return也可以省略
// 上述代码最终优化为
LambdaExample lambdaExample = param -> param;
五、总结
- 本章主要针对Lambda的概念、语法、基本用法进行一些简要的描述,并提供一些示例代码;
- Lambda在某些场景允许简化,本章仅对Lambda的语法结构进行简化,后续章节我们会讲述其他简化方案。