Lambda表达式作为Java8引入的新语法,使Java也可以实现函数式编程风格。
函数式编程与命令式编程最大的不同在于:函数式编程关心数据的映射,命令式编程关心解决问题的步骤,面向对象编程是也是一种命令式编程。
另外函数式编程强调没有“副作用”,对目标对象的处理结果不应该改变原来的对象,其他外部变量也不应该受到影响,也正是这个特性,函数式编程的并行化处理也不需要关注锁的问题。
java的Lambda表达式与interface紧密相关,在使用前首先应该对函数定义有比较清晰的了解,并不是所有的地方都可以使用Lambda表示来简化,比如通过Lambda表达式来创建一个进程
new Thread(() -> {
System.out.println("runnable running");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("runnable exit");
}).start();
由于Thread需要一个实现Runnable的类作为参数,同时Runnable只有一个方法需要实现,该方法不需要传入参数,那么就可以直接通过如下的形式来替代之前的匿名类:
() -> { //相关代码,如果只有一条执行语句,可以不要大括号 }
像GUI类型的需要传入event参数的
event -> { //相关代码 }
这意味着在设计公共接口的时候也要注意这样的限制,如果希望你的接口可以方便用户使用Lambda表达式来调用,那么定义的interface应当仅包含一个需要实现的方法。
再如,现在定义一个二目运算,但具体是加、减等方式由用户自己决定,这边只演示整型,其实java8里面已经有类似的接口
interface MyBiFunc {
long apply(long left, long right);
}
然后定义处理的函数
static long biFunc(long left, long right,
MyBiFunc biFunction) {
return biFunction.apply(left, right);
}
最后在调用时实现具体的操作
public static void main(String[] args) {
long num1 = 2, num2 = 3;
System.out.println("add res=" + biFunc(num1, num2, (left, right) -> left + right));
System.out.println("multiply res=" + biFunc(num1, num2, (left, right) -> left * right));
}
在参数类型模棱两可的时候,可以手动设置参数的类型,例如
(long left, long right) -> { //相关代码 }