JDK1.8 Lambda 表达式的使用

百度百科的解释java

“Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式能够表示闭包(注意和数学传统意义上的不一样)。express

基本的语法api

List<String> lists=Arrays.asList("a","b","c","d");
for (String s:lists){
    System.out.println(s);
}
//1.只能顺序处理List中的元素(process one by one)
//2.不能充分利用多核CPU
//3.不利于编译器优化

List<String> lists2=Arrays.asList("a","b","c","d");
lists2.forEach(i-> System.out.println(i));

//1.不必定须要顺序处理List中的元素,顺序能够不肯定
//2.能够并行处理,充分利用多核CPU的优点
//3.有利于JIT编译器对代码进行优化

lambda表达式能够分解成三部分来看: (1)参数列表 (2)-> (3)lambda体,闭包

i -> System.out.println(i))并发

左边是参数列表,lambda能够接收任意多个参数,当参数数量大于1时,须要将参数括起来,如 app

(i,j)->System.out.println(i+j))函数

若是不须要指定参数,须要使用()来表示无参,如性能

()->System.out.println("hello lambda")学习

能够看到咱们并无声明参数的数据类型,这是由于不少状况下,编译器能从上下文中推导出数据的参数类型,固然咱们能够显示的指定类型优化

(int i,int j)->System.out.println(i+j))

函数箭头的右侧是lambda体,上面的例子中只有一行代码,当有多行代码时,须要使用{}括起来,如

(i,j) ->{System.out.println(i);System.out.println("----"); }

若是lambda体中的表达式有返回值,须要使用return来返回,也能够后面跟一个参数来停止lambda体,

(i,j)->return i+j  或 (i,j)->i+j;

函数式接口:

理解函数式接口,是学习lambda表达式的关键,函数式接口的定义其实比较简单,对于任意一个接口(interface),若是他只包含一个(抽象)方法,那么这个接口就能够称之为函数式接口,这种接口被@FunctionalInterface注解标示。引入了一个新的包java.util.function,这个包中定义了不少函数式接口用于支持lambda表达式。

@FunctionalInterface
    public interface Function<T, R> {
        R apply(T t);
    }

    public static int changeTheValue(int value ,Function<Integer,Integer> function){
        return function.apply(value);
    }
    @Test
    public void testChangeTheValue(){
        int value=10;
        int result1=changeTheValue(value,i->i+5);
        System.out.println("result1:"+result1);
        int result2=changeTheValue(value,(i)->i*30);
        System.out.println("result2"+result2);

    }

总结优势:简洁,并发更有优点。

缺点:不在并发状况使用,有时候会下降性能,不易于调试。

认识还比较浅,毕竟使用的少,之后会随着本身的认识加深补充修改。

补充知识点 Streamapi 和 lambda 配合使用

相关文章
相关标签/搜索