lambda内容讲解--通俗易懂

此文章介绍lambda表达式的由来,如何变化的。让大家更容易理解。其他介绍lambda的文章,只介绍了语法,不知道为何这样写。结合函数式编程。一起讲解。

lambda表达式是由匿名类(匿名函数)演化而来。以前写匿名函数,代码太多,比较复杂,其实也是一段代码。改用lambda表达式后,简洁清晰。

必须是jdk8以上才可以。

目录

lambda演化过程

无参演化过程

 有参演化过程

函数式编程


lambda演化过程

无参演化过程

先写一个接口,内部只能有一个方法,方法多了,就不能用lambda转化了。idea也有提示功能,提示匿名函数转化为lambda。

public interface UserService {

    String getName();

}

在写一个测试方法

public static void main(String[] args) {
       
        String name = addName(
                 // 匿名函数代码
                new UserService() {
                    @Override
                    public String getName() {
                        return "lisi";
                    }
                }
        );

        //输出lisi====haole
        System.out.println(name);
    }

    private static String addName(UserService userService) {
        return userService.getName()+"====haole";
    }

idea中,将鼠标放在代码上有提示

 鼠标点一下结果如图

lambda图1

到这里大家就看到了lambda的模型了。 

解释:

lambda语法形式为 () -> {},其中 () 用来描述参数列表,{} 用来描述方法体,-> 为 lambda运算符 ,读作(goes to)。

上图--lambda图1,是最简洁的表现形式,只不过逻辑代码只有一行就省掉了{},和return;用完全的语法写是这样的。

lambda图 2

如果代码比较复杂,就不能省略了,比如:

总结:所有lambda表达式的写法都会有一个函数接口。更多的lambda语法:

// 1. 不需要参数,返回值为 5  
() -> 5  
  
// 2. 接收一个参数(数字类型),返回其2倍的值  
x -> 2 * x  
  
// 3. 接受2个参数(数字),并返回他们的差值  
(x, y) -> x – y  
  
// 4. 接收2个int型整数,返回他们的和  
(int x, int y) -> x + y  
  
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)  
(String s) -> System.out.print(s)

 有参演化过程

函数接口

public interface UserService {

    String getName(int age);

}

 调用实现


    public static void main(String[] args) {

        String name = addName(8,
                // 匿名函数
                new UserService() {
                    @Override
                    public String getName(int age) {
                        return "lisi--" + age + "year";
                    }
                });

        System.out.println(name);
    }

    private static String addName(int age, UserService userService) {
        return userService.getName(age) + "====haole";
    }

lambda写法实现

public static void main(String[] args) {

        String name = addName(8,
                // 匿名函数 int 可以省略 return可以省略。复杂代码不可以
                (int age) -> {
                    return "lisi--" + age + "year";
                }
        );

        System.out.println(name);
    }

    private static String addName(int age, UserService userService) {
        return userService.getName(age) + "====haole";
    }

int省略,是因为函数接口就一个方法,所以程序可以自动推断,参数的类型及返回值。

函数式编程

jdk8新增了很多函数式接口;在java.util.function包下可以看这些接口类。他们类上都有一个注解:

@FunctionalInterface;该注解限制此接口只有一个public 方法,其他都是defaul修饰。如果有多个public 修饰的方法,程序就不能推断用哪一个了

自定义函数式接口的例子

@FunctionalInterface
public interface UserService {

    String getName(int age);

    default String getCityName() {
        return "aa";
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值