Lambda表达式
Lambda是JDK1.8推出的重要新特性。很多开发语言都开始支持函数式编程,其中最具备代表性的就是haskell。
函数式编程和面向对象编程可以理解为两大开发阵营。很多人认为面向对象的概念过于完整,结构操作不明确。
我们编写一个简单的加法程序为例
- 当我们如果不仅使用
x+y
方法时,比如说想扩展x+y+10
方法时,我们会发现,我们需要像函数重载一样编写多个函数。
package www.bit.java;
class Add {
public void add(int x,int y){
System.out.println(x+y);
}
public void add1(int x,int y){
System.out.println(x+y+10);
}
}
public class MyEnum {
public static void main(String[] args) {
Add add = new Add();
add.add(10,20); // 30
add.add1(10,20); // 40
}
}
- 面象对象设计(使用内部类)
package www.bit.java;
interface Add {
void add(int x,int y);
}
public class MyEnum {
public static void main(String[] args) {
Add add = new Add() {
@Override
public void add(int x, int y) {
System.out.println(x+y);
}
};
add.add(10,20);
Add add1 = new Add() {
@Override
public void add(int x, int y) {
System.out.println(x+y+10);
}
};
add1.add(10,20);
}
}
- 函数式编程
package www.bit.java;
interface Add {
void add(int x,int y);
}
interface Mul{
int mul(int x,int y);
}
interface Sub {
int sub(int x,int y);
}
public class MyEnum {
public static void main(String[] args) {
// 方法体只有一行代码时: (方法参数) -> 具体方法体实现
Add add = (x,y) -> System.out.println(x+y);
add.add(10,20); // 30
// 当方法有返回值时,单行代码的Lambda表达式可以省略return语句
Mul mul = (x,y) -> x/y;
System.out.println(mul.mul(10,5)); // 2
/*
当方法体有多行代码时
(方法参数)-> {
...;
...
return 语句;
};
*/
Sub sub = (x,y) -> {
int temp = x*y;
x += 2;
y -= 1;
return temp-x-y;
};
System.out.println(sub.sub(5,4)); // 10
}
}
要想使用函数式编程有一个前提:接口必须只有一个抽象方法。如果存在两个以上的方法,无法使用函数式编程。
如果现在某个接口就是为了函数式编程而生的,在定义时只能存在一个方法,因此有一个新的注解@FunctionalInterface
,此注解会检查该接口中是否只存在一个抽象方法,存在两个抽象方法以上编译报错。
package www.bit.java;
import javax.xml.ws.FaultAction;
@FunctionalInterface // 是一个函数式编程接口,只允许有一个方法
interface Add {
int add(int x,int y); // 这是一个接口,接口中的抽象方法必须由子类覆写。
}
public class MyEnum {
public static void main(String[] args) {
Add add = (x,y) -> x+y;
System.out.println(add.add(10,20));
}
}
接口增强
- 使用default定义的普通方法,需要通过接口对象来调用。
- 使用static定义的静态方法,直接使用接口名调用。
interface IInterface {
void test();
default void fun(){
System.out.println("1-----------");
}
static void method() {
System.out.println("2-----------");
}
}
class InterfaceImpl implements IInterface {
public void test(){
System.out.println("3---------------");
}
}
public class Test {
public static void main(String[] args) {
IInterface in = new InterfaceImpl();
in.test();
in.fun();
IInterface.method();
}
}