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(value
findeemployee()
返回一个匿名函数(实际上是
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了解“函数接口”任何方法都可以用