java函数接口与lambda表达式
功能接口java函数接口与lambda表达式,java,lambda,java-stream,Java,Lambda,Java Stream,功能接口 import java.util.ArrayList; public interface EmployeeAudit { public ArrayList<String> fetchEmployeeDetails (double salary); } import java.util.ArrayList; 公共接口EmployeeAudit{ 公共ArrayList获取EmployeeDetails(双薪); } 公开课 public static Emplo
import java.util.ArrayList;
public interface EmployeeAudit {
public ArrayList<String> fetchEmployeeDetails (double salary);
}
import java.util.ArrayList;
公共接口EmployeeAudit{
公共ArrayList获取EmployeeDetails(双薪);
}
公开课
public static EmployeeAudit findEmployee(){
ArrayList<String> name=new ArrayList<>();
return (sal) -> {
employeeMap.forEach((key,value) -> {
if(value<=sal)
name.add(key);
});
return name;
};
}
publicstaticemployeeauditfindeemployee(){
ArrayList name=新的ArrayList();
返回(sal)->{
employeeMap.forEach((键,值)->{
如果(value您的方法findeemployee()
确实实例化了EmployeeAudit
对象。EmployeeAudit
是一个接口,因此它需要定义它的方法,因为它们的方法只有一个,它是一个函数接口,可以用lambda完成,但thta相当于
public static EmployeeAudit findEmployee() {
ArrayList<String> name = new ArrayList<>();
return new EmployeeAudit() {
@Override
public ArrayList<String> fetchEmployeeDetails(double sal) {
employeeMap.forEach((key, value) -> {
if (value <= sal)
name.add(key);
});
return name;
}
};
}
您甚至可以想象创建实现EmployeeAudit
的类并非常容易地使用它
import java.util.ArrayList;
导入java.util.HashMap;
导入java.util.Map;
界面员工审计{
ArrayList获取EmployeeDetails(双薪);
}
公开课考试{
静态映射employeeMap=newhashmap();
公共静态void main(字符串[]args){
雇员地图。放在(“Jean”,10);
employeeMap.put(“Jean2”,100);
employeeMap.put(“Jean3”,100);
EmployeeAudit ea=新员工审核员工();
ArrayList str=ea.fetchEmployeeDetails(10);
系统输出打印项次(str);
}
静态类EmployeeAuditEmpll实现EmployeeAudit{
@凌驾
公共数组列表获取员工详细信息(双sal){
ArrayList name=新的ArrayList();
employeeMap.forEach((键,值)->{
如果(value您的方法findeemployee()
确实实例化了EmployeeAudit
对象。EmployeeAudit
是一个接口,因此它需要定义它的方法,因为它们的方法只有一个,它是一个函数接口,可以用lambda完成,但thta相当于
public static EmployeeAudit findEmployee() {
ArrayList<String> name = new ArrayList<>();
return new EmployeeAudit() {
@Override
public ArrayList<String> fetchEmployeeDetails(double sal) {
employeeMap.forEach((key, value) -> {
if (value <= sal)
name.add(key);
});
return name;
}
};
}
您甚至可以想象创建实现EmployeeAudit
的类并非常容易地使用它
import java.util.ArrayList;
导入java.util.HashMap;
导入java.util.Map;
界面员工审计{
ArrayList获取EmployeeDetails(双薪);
}
公开课考试{
静态映射employeeMap=newhashmap();
公共静态void main(字符串[]args){
雇员地图。放在(“Jean”,10);
employeeMap.put(“Jean2”,100);
employeeMap.put(“Jean3”,100);
EmployeeAudit ea=新员工审核员工();
ArrayList str=ea.fetchEmployeeDetails(10);
系统输出打印项次(str);
}
静态类EmployeeAuditEmpll实现EmployeeAudit{
@凌驾
公共数组列表获取员工详细信息(双sal){
ArrayList name=新的ArrayList();
employeeMap.forEach((键,值)->{
if(valuefindeemployee()
返回一个匿名函数(实际上是EmployeeAudit
定义为函数,因为EmployeeAudit
是一个函数接口)
此函数定义为获取一个名为sal
的输入参数,但这不是主调用的sal
:您可以将sal
重命名为findeemployee
中的任何其他参数,代码的工作原理相同
内部sal
是可以在任何其他常规函数中使用的参数名称:
ArrayList<String> str = findEmployee().fetchEmployeeDetails(sal);
void someFunction(double sal){???}
findeEmployee()
返回一个匿名函数(实际上是EmployeeAudit
定义为函数,因为EmployeeAudit
是一个函数接口)
此函数定义为获取一个名为sal
的输入参数,但这不是主调用的sal
:您可以将sal
重命名为findeemployee
中的任何其他参数,代码的工作原理相同
内部sal
是可以在任何其他常规函数中使用的参数名称:
ArrayList<String> str = findEmployee().fetchEmployeeDetails(sal);
void someFunction(double sal){???}
如果用实现EmployeeAudit
的匿名类替换lambda表达式,您是否能够回答自己的问题?始终避免在lambda中变异外部引用。更好的版本是:EmployeeAudit aud=sal->employeeMap.entrySet().stream().filter(e->sal>=e.getValue()).map(Entry::getKey).collect(Collectors.toList());
如果用实现EmployeeAudit
的匿名类替换lambda表达式,您是否能够回答自己的问题?始终避免在lambda中变异外部引用。更好的版本是:EmployeeAudit aud=sal->employeeMap.entrySet().stream().filter()(e->sal>=e.getValue()).map(Entry::getKey).collect(Collectors.toList());
那么这个抽象方法的重写只发生在函数接口的情况下?所以,我很理解你的答案。因为我们的findEmployee()具有接口EmployeeAudit的返回类型,因此它将创建该接口的实例,因此可以访问其成员函数(在本例中为fetchEmployeeDetails())。现在,您能否进一步解释findEmployee()的返回语句中的lambda函数如何覆盖fetchEmployeeDetails()?@varun了解“函数接口”类似。任何方法都可以用lambda定义,但如果接口有单个方法,也可以用lambda定义:这是一个函数接口。这种对抽象方法的重写只发生在函数接口的情况下?所以,我很理解你的答案。因为我们的findEmployee()具有接口EmployeeAudit的返回类型,因此它将创建该接口的实例,因此可以访问其成员函数(在本例中为fetchEmployeeDetails())。现在,您能否进一步解释findEmployee()的返回语句中的lambda函数如何覆盖fetchEmployeeDetails()?@varun了解“函数接口”任何方法都可以用