编程语言
首页 > 编程语言> > Java8的Lambda表达式

Java8的Lambda表达式

作者:互联网

Lambda表达式是什么?传递匿名函数的一种方式,它没有名称,但有参数列表、函数主体、返回类型,还有一个可以抛出的异常列表。


看不懂?没有关系,上例子:

(Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight())

其中红色字体就是Lambda的参数,蓝色字体就是Lambda的主体,该表达式的功能与下面的代码功能是一码事儿:

Comparator<Apple> byWeight = new Comparator<Apple>(){

    public int compare(Apple a1, Apple a2) {

        return a1.getWeight().compareTo(a2.getWight());

    }

}

即对一个装着Apple的集合按重量排序。使用Lambda表达式即为:Comparator<Apple> byWeight = (Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight()); 

从代码量上来看是少了,至于表达是否更清晰与否,就看你见Lambda的次数了,见的多了就清晰了,见的少了就一头雾水。


为了让你进一步晕,先把五种有效的Lambda表达式例出来:

          System.out.println("Result:" + (x + y));

      }  具有两个int类型的参数,没有返回值,由于使用{},{}里面可以有多行语句


所以Lambda的基本语法为:

(parameters) -> Expression     或者    (parameters) -> { statements; }


书中立马给出几个示例,让你判断是否为有效的Lambda表达式:

很明显前3个是,后2个不是,因为第4个箭头后面已不是表达式,它是一个statement; 第5个{}内是一个expression,而不是一个statments。


所以君呀,前面参数列表好懂,后面若是{}则里面必须为语句,若不是{}则->后必须是一个表达式。


为了让你能熟悉,再给你几个示例:


知道了Lambda这个表达式存在,它的使用场景是怎么样的呢?书中给出了答案:你可以在函数式接口上使用Lambda表达式。

那什么是函数式接口?

只定义一个抽象方法的接口(首先是接口,然后有抽象方法,再后是一个,而不是多个或者没有),如:

public interface Predicate<T> {

    boolean test(T t); // 仅仅定义一个抽象方法

}


为了让你更明白,有一个测试题:下面哪些接口是函数式接口?

           int add(int a, int b);

        }


            int add(double a, double b);

        }


       }

只有第一个接口是函数式接口; 第二个它定义了两个叫add的抽象方法(一个是从Adder继承来的,另一个是自定义的);第三个没有声明抽象方法。


用函数式接口可以做什么呢?

Lambda表达式允许你直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例。

有点绕,不容易看懂,简单地来说,Lambda就是为函数式接口提供一个具体实现。

Runnable r1 = () -> System.out.println("Hello World 1");


当然你也可以使用匿名类:

Runnable r2 = new Runnable(){

     public void run(){

         System.out.println("Hello World");

    }

}


public void process(Runnable r){

     r.run()

}


实现:

process(r1);

或者

process(r2);

或者

process(() -> System.out.println("Hello World"));

标签:Apple,int,Java8,a1,a2,getWeight,表达式,Lambda
来源: https://blog.51cto.com/qingkechina/2550579