如果面试问道lambda原理应该怎么回答?
如果面试问道lambda原理应该怎么回答?
Lambda表达式是一种匿名函数,它可以在需要函数的地方被直接定义和使用。它由三个部分组成:参数列表、箭头符号和函数体。参数列表指定了函数的输入参数,箭头符号用于连接参数列表和函数体,函数体定义了Lambda表达式的具体实现。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到底是啥
看到上面的@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);
Lambda表达式在Java中的原理是利用函数式接口来实现匿名内部类的简洁写法。Lambda表达式通过指定函数式接口的参数类型和返回值类型,来创建一个匿名内部类的实例。Lambda表达式的形式为“(参数列表) -> 表达式/语句块”,其中参数列表可以为空,多个参数可以用逗号隔开,表达式/语句块可以是单一语句或多行代码块。Lambda表达式可以作为方法参数或返回值来传递和使用。Lambda表达式在实现过程中,会自动推断参数类型和返回值类型,所以不需要显式地指定类型。
如果在面试中被问到Lambda表达式的原理,可以从函数式接口、Lambda表达式的语法结构、Lambda表达式实现匿名内部类的机制等方面进行回答。接着,可以举例说明Lambda表达式的应用场景,如使用Lambda表达式实现字符串数组的升序和降序排列、包装类型数组的升序和降序排列等。最后,可以介绍Lambda表达式的优缺点及适用性等方面的内容。