JDK1.8 Lambda 表达式的使用

Lambda表达式介绍及优缺点分析
本文介绍了Lambda表达式,它是基于数学中λ演算的匿名函数,可表示闭包。阐述了其基本语法,包括参数列表、箭头和lambda体的使用规则。还提到函数式接口是学习关键,新包java.util.function支持它。总结了其优缺点,最后提及可与Streamapi配合使用。

百度百科的解释

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

基本的语法

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时,需要将参数括起来,如 

(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 配合使用

转载于:https://my.oschina.net/haitaohu/blog/1934321

JDK 1.8 中引入了 Lambda 表达式,它是一种简洁而强大的编程语法,用于支持函数式编程。Lambda 表达式可以用来替代一些需要使用匿名内部类的情况,并提供了更简洁的语法来定义函数式接口的实现。 Lambda 表达式的基本语法如下: ```java (parameters) -> { body } ``` 其中,parameters 是参数列表,可以为空或包含一个或多个参数,多个参数之间使用逗号分隔。body 是 Lambda 表达式的主体,可以是一个表达式或一段代码块。 下面是一些常见的 Lambda 表达式用法示例: 1. Lambda 表达式作为函数式接口的实现: ```java // 定义一个函数式接口 interface MyInterface { void doSomething(); } // 使用 Lambda 表达式实现函数式接口 MyInterface lambda = () -> { System.out.println("Doing something..."); }; // 调用 Lambda 表达式 lambda.doSomething(); ``` 2. Lambda 表达式作为参数传递给方法: ```java // 定义一个接受函数式接口作为参数的方法 void performAction(MyInterface action) { action.doSomething(); } // 使用 Lambda 表达式作为参数传递 performAction(() -> { System.out.println("Performing action..."); }); ``` 3. Lambda 表达式与集合的结合: ```java List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); // 使用 Lambda 表达式遍历集合 names.forEach(name -> { System.out.println("Hello, " + name); }); ``` Lambda 表达式还支持方法引用、参数类型推断等特性,可以更进一步简化代码。它在函数式编程和并行处理等场景中具有很大的优势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值