Java 函数式接口 lambda

时间:2021-05-27 19:10:25
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

public class Demo1 {

    public static void main(String[] args) {
        // 使用lambda表达式,如runnable
        Thread th1 = new Thread(() -> {
            System.out.println("lambda 创建线程"+Thread.currentThread().getName());
        });
        th1.start();
        /* 1、说明:()->{} 这里的()是参数列表,{}是执行主体,->分割参数列表和执行主体
         * 2、那么什么函数可以使用lambda表达式呢?
         *    答:函数式接口。
         * 3、什么是函数式接口?
         *    答:只定义一个抽象方法的接口。比如Runnable、Callable、Comparator
         * 4、如何检查函数式接口?
         *    答:JDK8中提供了@FunctionInterface注解来专门表示函数式接口,用来对接口的声明进行语法检查。
        */
        //自定义函数式接口
        User user1=new User();
        user1.setName("王一");
        user1.setAge(10);
        user1.setSex("女");
        User user2=new User();
        user2.setName("王二");
        user2.setAge(20);
        user2.setSex("男");
        User user3=new User();
        user3.setName("王三");
        user3.setAge(30);
        user3.setSex("女");
        List<User> users=new ArrayList<User>();
        users.add(user1);
        users.add(user2);
        users.add(user3);
        //查询年龄在15-30之间的用户
        List<User> res=User.userFilter(users, user->user.getAge()>15&&user.getAge()<30);
        System.out.println("年龄在15-30之间的用户:"+res);
        //查询性别是女的用户
        List<User> res2=User.userFilter(users, user->user.getSex().equals("女"));
        System.out.println("性别是女的用户:"+res2);
        //查询年龄在15-30之间的用户--泛型
        List<User> res3=FuncInterfaceTWarp.filterT(users,t->((User)t).getAge()>15&&((User)t).getAge()<30);
        System.out.println("年龄在15-30之间的用户--泛型:"+res3);
        //查询性别是女的用户--泛型
        List<User> res4=FuncInterfaceTWarp.filterT(users,t->((User)t).getSex().equals("女"));
        System.out.println("性别是女的用户--泛型:"+res4);
    }

}



/**
 * 用户实体
 *
 */
class User implements Serializable{
    
    private static final long serialVersionUID = 1L;
    
    private String name;
    private Integer age;
    private String sex;
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    
    @Override
    public String toString() {
        return "User [name=" + name + ", age=" + age + ", sex=" + sex + "]";
    }
    public static List<User> userFilter(List<User> users,FuncInterface funcInterface){
        List<User> res=new ArrayList<User>();
        for(User user:users){
            if(funcInterface.execute(user)){
                res.add(user);
            }
        }
        return res;
    }
    
}

/**
 * 定义函数式接口
 * @author Administrator
 *
 */
@FunctionalInterface
interface FuncInterface{
    
    boolean execute(User user);
    
}

/**
 * 定义泛型函数式接口
 *
 */
@FunctionalInterface
interface FuncInterfaceT<T>{
    
    boolean execute(T t);
    
}

/**
 * 定义泛型函数式接口包装类
 *
 */
class FuncInterfaceTWarp{
    
    public static <T>List<T> filterT(List<T> objs,FuncInterfaceT<T> funcInterfaceT){
        List<T> res=new ArrayList<>();
        for(T t:objs){
            if(funcInterfaceT.execute(t)){
                res.add(t);
            }
        }
        return res;
    }
}