面向对象的思想
:
做一件事情
,
找一个能解决这个事情的对象
,
调用对象的方法
,
完成事情
函数式编程思想:
只要能获取到结果
,
谁去做的
,
怎么做的都不重要
,
重视的是结果
,
不重视过程
Java 8
(
JDK 1.8
)中,加入了
Lambda
表达
式。借助Java 8
的全新语法,
Runnable
接口的匿名内部类写法可以通过更简单的
Lambda
表达式达到等效。
Lambda
标准格式
Lambda
格式由
3
个部分
组成: 一些参数、一个箭头、一段代码
Lambda
表达式的
标准格式
为:
(
参数类型 参数名称
) ‐> {
代码语句
}
格式说明:
():接口中抽象方法的参数列表,小括号内的语法与传统方法参数列表一致:无参数则留空;多个参数则用逗号分隔。
():接口中抽象方法的参数列表,小括号内的语法与传统方法参数列表一致:无参数则留空;多个参数则用逗号分隔。
->:传递的意思,把参数传递给方法体{},是新引入的语法格式,代表指向动作。
{}:重写接口的抽象方法的方法体,大括号内的语法与传统方法体要求基本一致。
public class lambda {
public static void main(String[] args) {
//匿名内部类,实现多线程
new Thread(new Runnable(){
//重写run方法,设置线程任务
public void run(){
System.out.println(Thread.currentThread().getName()+"hj"+i);
}
}).start();
//lambda表达式,实现多线程
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"hj"+i);
}).start();
}
}
/*
Lambda表达式有参数有返回值的练习
需求:
给定一个计算器calculator接口,内含抽象方法calc可以将两个int数字相加得到和值
使用Lambda的标准格式调用invokecalc方法,完成120和130的相加计算
*/
public interface calculator {
public abstract int calc(int a,int b);
}
public class calcultormain {
public static void main(String[] args) {
//匿名内部类
invokecalc(120, 130, new calculator() {
@Override
public int calc(int a, int b) {
return a+b;
}
});
//简化
invokecalc(120, 130, (int a, int b)-> {
return a+b;
}
);
}
/*
定义一个方法
参数传递两个int类型的整数
参数传递calculator接口
方法内部调用calculator中的方法calc计算两个整数的和
*/
public static void invokecalc(int a,int b,calculator c){
int sum=c.calc(a,b);
System.out.println(sum);
}
}
Lambda
省略格式
可推导即可省略,凡是可以根据上下文推导出来的内容都可以省略
Lambda
强调的是
“
做什么
”
而不是
“
怎么做
”
,所以凡是可以根据上下文推导得知的信息,都可以省略。例如上例还可
以使用
Lambda
的省略写法:
省略规则
在
Lambda
标准格式的基础上,使用省略写法的规则为:
1.
小括号内参数的类型可以省略;
2.
如果小括号内
有且仅有一个参数
,则小括号可以省略;
3.
如果大括号内
有且仅有一个语句
,则无论是否有返回值,都可以省略大括号、
return
关键字及语句分号(要省略一起省略)
//简化
invokecalc(120, 130, (int a, int b)-> {
return a+b;
}
);
//省略
invokecalc(120, 130, ( a, b)-> a+b);
Lambda
的使用前提
Lambda
的语法非常简洁,完全没有面向对象复杂的束缚。但是使用时有几个问题需要特别注意:
1.
使用
Lambda
必须具有接口,且要求
接口中有且仅有一个抽象方法
。
无论是
JDK
内置的
Runnable
、
Comparator
接口还是自定义的接口,只有当接口中的抽象方法存在且唯一时,才可以使用Lambda
。
2.
使用
Lambda
必须具有
上下文推断
。
也就是方法的参数或局部变量类型必须为
Lambda
对应的接口类型,才能使用
Lambda
作为该接口的实例。
备注:有且仅有一个抽象方法的接口,称为
“
函数式接口
”
。