面向对象的最大的优点在于:结构必须非常完整。当然,这是它的最大的优点,也是他的缺点。结果过于完整就使得写一个小的输出就得定义完整的结构,比如下面的:
interface IMessage{
public void print();
}
public class TestDemo{
public static void main(String args[]) {
IMessage msg=new IMessage() {
public void print() {
System.out.println("hello world");
}
};
msg.print();
}
}
但是为了输出这么一句话写了这么多代码,实在太累了,下面我们使用函数式编程的lambda来执行上面同样的功能:
interface IMessage{
public void print();
}
public class TestDemo{
public static void main(String args[]) {
IMessage msg=()->System.out.println("hello world");
msg.print();
}
}
上面就是一个函数式编程lambda的实现。但是使用Lambda表达式有一个前提,那就是接口必须有一个方法,如果这个接口有多个待实现的方法,那么就不能使用Lambda表达式。
但是,为了解决让一个接口只有一个抽象方法问题,我们可以使用函数式注解这个东东——@FunctionalInterface。下面演示的是当使用了这个注解的时候,如果接口里面有两个抽象方法,接口本身就会立即报错,删掉一个抽象方法就可以了。注解的目的就是告诉接口你是一个函数式接口,不能有两个抽象方法。
@FunctionalInterface
interface IMessage{
public void print();
public void fun();
}
public class TestDemo{
public static void main(String args[]) {
IMessage msg=()->System.out.println("hello world");
msg.print();
}
}
Lambda表达式的语法形式
(参数)->语句
下图表示的就是这个相似的过程。
如果使用Lambda要执行多条语句那么就要使用到{}来解决
@FunctionalInterface
interface IMessage{
public void print();
}
public class TestDemo{
public static void main(String args[]) {
IMessage msg=()->{
System.out.println("hello world");
System.out.println("hello world");
System.out.println("hello world");
};
msg.print();
}
}
如果Lambda表达式需要有返回值的话,那么可以直接写结果,不用return就行
@FunctionalInterface
interface IMath{
public int add(int x,int y);
}
public class TestDemo{
public static void main(String args[]) {
IMath math=(p1,p2)->p1+p2;
System.out.println(math.add(10, 20));
}
}