`
xuanzhui
  • 浏览: 197018 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Lambda表达式初识

    博客分类:
  • Java
阅读更多

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) -> { //相关代码 }

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics