java lambda表达式原理?

img

如果面试问道lambda原理应该怎么回答?

如果面试问道lambda原理应该怎么回答?

Lambda表达式是一种匿名函数,它可以在需要函数的地方被直接定义和使用。它由三个部分组成:参数列表、箭头符号和函数体。参数列表指定了函数的输入参数,箭头符号用于连接参数列表和函数体,函数体定义了Lambda表达式的具体实现。Lambda表达式的本质是一个对象,它可以被赋值给变量、传递给方法或作为函数返回值,从而提供了更加灵活的编程方式。Lambda表达式主要应用于函数式编程和简化代码等场景。

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7678948
  • 这篇博客你也可以参考下:java lambda表达式与匿名内部类不是等价关系,lambda不仅仅是语法比匿名内部类更简便
  • 除此之外, 这篇博客: Java的lambda表达式以及双冒号写法的一些浅薄理解中的 lambda表达式和函数式接口 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 首先lambda是想将函数当成参数传递给某个方法,设计者是想做这样的设计,
    但是实际上java是不能直接在方法参数里塞方法的,只能够塞对象。那咋办呢?
    于是就引入了lambda表达式的设计,这种设计通过简化函数式接口的书写,实现了看起来像是真的将函数当成参数传递给某个方法了。但是实际上还是仅仅传入了函数式接口作为参数,不是真的把方法塞到方法参数里去。

    看以下代码,这里结合List的forEach方法。首先先匿名实现了一个函数式接口caseitemFunction (见第一步),
    由于是函数式接口,所以可以使用lambda表达式实现:(见第二步) 。两者是等价的。
    
    // 第一步,匿名实现了一个函数式接口,创建了一个对象
    Consumer<CaseitemProcess> caseitemFunction = new Consumer<CaseitemProcess>() {
    	@Override
    	public void accept(CaseitemProcess caseitem) {
    		caseitem.setId(caseitem.getId()+"111");
    	}
    };
    
    // 第二步,使用lambda表达式实现函数式接口,创建了一个对象
    Consumer<CaseitemProcess> lambdaFunction = v->v.setId(v.getId()+"111");;
    caseitemProcesses.forEach(caseitemFunction);
    caseitemProcesses.forEach(lambdaFunction );
    
    // 第三步,forEach方法里塞的实际上是第二步同种对象,
    // 这样写看起来就像是传入了方法一样
    caseitemProcesses.forEach( v -> v.setId(v.getId()+"111") );
    
    然后看第三步,此时就可以将第二步里的使用lambda方式,直接写入forEach()方法里,
    实际上  v->v.setId(v.getId()+"111");  不是一个方法,而是一个对象。
    

    我们再跳入list的forEach方法里验证下,看看里面参数到底是啥
    请添加图片描述
    我们发现这个传入的是一个Comsumer对象,然后我们再看看这个Comsumer到底是啥
    Comsumer接口的源码
    看到上面的@FunctionalInterface了么?这个注解是注明函数式接口的,也就是说forEach方法传入的就是一个函数式接口。

    我们知道传入的参数实际上是匿名实现的函数式接口(注意接口本身不能被实例化),那么这个Consumer是怎么执行lambda传进去的方法的呢?答案是直接调用他的唯一方法accept()即可

    Consumer<CaseitemProcess> caseitemFunction = new Consumer<CaseitemProcess>() {
    	@Override
    	public void accept(CaseitemProcess caseitem) {
    		caseitem.setId(caseitem.getId()+"111");
    	}
    };
    
    CaseitemProcess process = new CaseitemProcess();
    process.setId(222);
    // 此时就执行里面将id设成+111的方法了
    caseitemFunction.accept(process); 
    
  • 您还可以看一下 沙利穆老师的由浅入深学Java课程中的 认识Lambda表达式小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    Lambda表达式在Java中的原理是利用函数式接口来实现匿名内部类的简洁写法。Lambda表达式通过指定函数式接口的参数类型和返回值类型,来创建一个匿名内部类的实例。Lambda表达式的形式为“(参数列表) -> 表达式/语句块”,其中参数列表可以为空,多个参数可以用逗号隔开,表达式/语句块可以是单一语句或多行代码块。Lambda表达式可以作为方法参数或返回值来传递和使用。Lambda表达式在实现过程中,会自动推断参数类型和返回值类型,所以不需要显式地指定类型。

    如果在面试中被问到Lambda表达式的原理,可以从函数式接口、Lambda表达式的语法结构、Lambda表达式实现匿名内部类的机制等方面进行回答。接着,可以举例说明Lambda表达式的应用场景,如使用Lambda表达式实现字符串数组的升序和降序排列、包装类型数组的升序和降序排列等。最后,可以介绍Lambda表达式的优缺点及适用性等方面的内容。