叨唠Java中的lambda表达式

Copyright©Stonee

1. lambda介绍和特点

  • lambda,即希腊字母“λ”。起源于逻辑学家Alonzo Church想要形式化地表示能有效计算的数学函数,他使用了希腊字母lambda(λ)来标记参数。我们把带参数变量的表达式称为lambda表达式。
  • 就我的理解,lambda表达式可以认为是带参函数的一种简写方式。
  • 我们需要注意,lambda表达式是数学上的意义,二不仅仅存在于Java之中,py等编程语言中也具有这样的特性。

2. Java中lambda表达式的语法

  • 我们先来看一个简单的方法:
void func(String s){
    System.out.println("stonee is so cool");
}

  如何用lambda表达式来表示呢?首先,因为lambda是实现了接口中的一个方法,所以我们可以省略方法的返回值,方法名,参数类型,这是式子会变成:

( s ) -> {System.out.println("stonee is so cool");}

  但同时,这个表达式中只有一个语句,我们还可以把表达式中的大括号省略。

  • 使用lambda表达式有一个先决条件,就是 lambda表达式所指向的变量的类型需要是只有一个抽象方法的接口 ,如:iF a = () -> System.out.println("Stonee is so cool"); 其中,iF 需要是一个 只有一个抽象方法的接口 ,而lambda表达式就是去实现这一接口中的方法。这种接口称为 函数式接口 。我们可以认为lambda表达式是一个block,是有类型的,在上例子中,它的类型就是 iF 。它只能有这一个类型。
  • 需要注意的是,lambda表达式只在某些分支返回一个值,而在另外一些分支不返回值,这是不合法的:(int x) -> {if (x >0 ) return 1;} 显然,上述例子并没有在 else 分支返回值

3. Java中为什么要引入lambda表达式?

  • 我们知道Java是一个面向对象的语言,在引入lambda表达式之前,要想传递代码段,Java必须构造一个对象,这个对象的类中要有一个包含所需代码段的方法,然后通过对象来传递代码段,可这样无疑太复杂了,通过使用lambda表达式可以直接传递代码段。栗子可以参考 第四点:lambda表达式的处理和应用中的函数式编程 。肉眼最直观来看,就是 lambda表达式的引入使得程序更加简洁

4. lambda表达式的处理和应用

  • 函数式编程(把lambda表达式嵌入到函数的一个参数中,即方法的方法):
package chapter06.Lambda;

public class Test01 {    
    public static void main(String [] args){        
        shit(s -> System.out.println(s),"Hello, world");   // 此处lambda表达式实现了dosomefxxk();方法
    }    
    public static void shit(I lambda, String s){                
        lambda.doSomeFxxk(s);    
    }
}
@Functional
Interfaceinterface I{    
    void doSomeFxxk(String s);
}

 但是当不适用lambda表达式的时候代码是这样的:

package chapter06.Lambda;

public class Test01 {    
    public static void main(String [] args){        
        Me okk = new Me();        
        shit(okk,"Hello, world");   
    }
    public static void shit(I lambda, String s){
        lambda.doSomeFxxk(s);
    }
}
@Functional
Interfaceinterface I{    
    void doSomeFxxk(String s);
}
class Me implements I { //先通过class来实现接口,再把对象传给shit方法    
    public void doSomeFxxk(String s){        
        System.out.println(s);    
    }
}

//上述皮毛,未完待续…

你可能感兴趣的:(Java,EE)