java8Lambda详解

###什么是 lambda?

#####百度百科
Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。

###lambda 的优点

  1. 没有使用Lambda表达式之前

    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class OldThread {
    public static void main(String[] args) {
    new Thread(new Runnable() {
    public void run() {
    System.out.println("Hello World!");
    }
    }).start();
    }
    }
  2. 使用了Lambda表达式之后

    1
    2
    3
    4
    5
    public class LambdaThread {
    public static void main(String[] args) {
    new Thread(() -> System.out.println("Hello World!")).start();
    }
    }

我们发现使用lambda只需一行代码就搞定了之前需要一个匿名类需要完成的事情,所以,Lambda 表达式是创建匿名内部类的语法糖。在编译器的帮助下,可以让开发人员用更少的代码来完成工作。

###lambda 的语法风格

#####Lambda表达式由三部分组成:
参数列表

箭头

主体

有两种风格,分别是:

#####表达式-风格
(parameters) -> expression

#####块-风格
(parameters) -> { statements; }


依据上面的风格介绍,来试着判断下面给出的示例是否有效:


  • () -> {}

  • () -> “Apple”

  • () -> { return “Apple”; }

  • (Integer i) -> return “Apple” + i

  • (String s) -> { “Apple”; }

解析:

  • (1)是块风格,没有语句;
  • (2)是表达式风格,一个字符串表达式;
  • (3)是块风格,有花括号和返回语句;
  • (4)非有效,写了返回语句,但缺少花括号,补上花括号和分号,为块风格,而去掉return则为表达式风格;
  • (5)非有效,”Apple”是一个字符串表达式,不是一个语句,加上return,或者去掉分号和花括号。
  • ###函数式编程接口
    Lambda表达式写好了,我们要知道哪里能用Lambda表达式。已知Lambda表达式可看作是匿名内部类的实现,那对于匿名内部类来说最重要的是类所实现的接口,而Lambda表达式是否可用于所有接口?答案“不是的”,Lambda表达式对接口有一定的要求,必须是函数式接口。

    所谓的函数式接口指的是只定义一个抽象方法的接口
    例如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public interface Comparator<T> {
    int compare(T o1, T o2);
    }

    public interface Runnable {
    void run();
    }
    public interface Callable<V> {
    V call() throws Exception;
    }

    ###复合Lambda表达式

    参考:https://github.com/alibaba/fastjson/wiki