Lambda表达式

本质上是一个匿名的方法:
先看下面这个例子,一个传统的方法

`public int add(int x,int y){
     return x+y;
 }`

转换为Lambda之后就是下面这个样子

(int x,int y)->x+y  //表达式
(int x,int y)->{return x+y};//语句块

lamdba表达式的组成:参数列表,箭头,以及一个语句块或者是表达式. 如下
()->{}
()为参数列表,参数的类型可以省略,Java编译器可以自动推断. 如果只有一个参数且可以被Java推断出类型,那么参数列表的括号也可以省略.

Lambda表达式的类型叫做”目标类型”,他是一个”函数接口”(定义:一个接口,如果只有一个显式声明的抽象方法,那么它就是一个函数接口。一般用@FunctionalInterface标注出来(也可以不标)。)

所以可以将Lambda表达式为一个函数接口赋值,如下
Runable接口就是一个函数接口,因为他只有一个显示声明的抽象run方法.所以可以如下使用lambda表达式.

Runable r1 = ()->{System.out.println("motian")};

一个λ表达式只有在转型成一个函数接口后才能被当做Object使用。

所以不能如下使用:

System.out.println(()->{System.out.println("motian")});

必须将先将Lambda转型如下

System.out.println((Runable)()->{System.out.println("motian")});

一个Lambda可以有多个目标的类型(函数接口),只要函数匹配成功就行.但至少应该有一个.
所以如下是可以的

Runnable r1 =() -> {System.out.println("mo");}; 
MyRunnable2 r2 = () -> {System.out.println("tian");}; 

应用

1.λ表达式主要用于替换,内部匿名类,各种回调,比如事件响应器、传入Thread类的Runnable等。如:

       Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    System.out.println("mo");
                }
            }
        });
        //可以如下书写    
        Thread lambda = new Thread(()->System.out.println("tian"));

2.Lambda表达式与集合类批处理操作
未使用Lambda表达式的的集合迭代操作

for(String str:list){
    System.out.println(str);
}

使用后可以调整为

list.forEach(str->{System.out.println(str)})

未完待续。。。。

你可能感兴趣的:(Lambda表达式)