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参数的
扫描二维码关注公众号,回复:
597542 查看本文章
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) -> { //相关代码 }