Lambda

28 阅读2分钟

基本写法及代码实现

样例1

定义一个接口:

package com.shadow.lambda.demo01;

/**
 * <p>@Description  </p>
 * <p>@Author      Shadow.Yu </p>
 * <p>@Date        2023-03-20 </p>
 **/
public interface Factory {

    Object getObject();
}

定义接口的实现类:

package com.shadow.lambda.demo01;

/**
 * <p>@Description  </p>
 * <p>@Author      Shadow.Yu </p>
 * <p>@Date        2023-03-20 </p>
 **/
public class SubClass implements Factory{
    @Override
    public Object getObject() {
        return new User();
    }
}

实体类:

package com.shadow.lambda.demo01;

/**
 * <p>@Description  </p>
 * <p>@Author      Shadow.Yu </p>
 * <p>@Date        2023-03-20 </p>
 **/
public class User {

    private String name;

    private int age;

    public User() {
        super();
    }

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + ''' +
                ", age=" + age +
                '}';
    }
}

Lambda测试类:

package com.shadow.lambda.demo01;

/**
 * <p>@Description  Lambda表达式初体验
 * 代码更简洁
 * 函数式编程:更关注函数/功能,而非对象
 * 函数是 第一等公民
 * 可以赋值给变量
 * 可以作为(其他函数的)参数进行传递
 * 可以作为(其他函数的)返回值
 * </p>
 * <p>@Author      Shadow.Yu </p>
 * <p>@Date        2023-03-20 </p>
 **/
public class LambdaTest {

    public static void main(String[] args) {
        //1.子类实现接口
        Factory factory = new SubClass();
        User user1 = (User) factory.getObject();
        System.out.println(user1);

        //2.匿名内部类
        factory = new Factory() {
            @Override
            public Object getObject() {
                return new User("张三", 29);
            }
        };
        User user2 = (User) factory.getObject();
        System.out.println(user2);

        //3.Lambda表达式
        factory = () -> {
            return new User("李四", 28);
        };
        User user3 = (User) factory.getObject();
        System.out.println(user3);

        //函数体中只有简单的表达式语句时,大括号可以省略
        factory = () -> new User("王五", 27);
        User user4 = (User) factory.getObject();
        System.out.println(user4);

        //Lambda作为参数进行传递
        User user5 = getUserFromFactory(factory, "User");
        System.out.println(user5);

        User user6 = getUserFromFactory(() -> {
            return new User("赵六", 26);
        }, "User");
        System.out.println(user6);

        //Lambda作为函数的返回值
        factory = getFactory();
        User user7 = (User) factory.getObject();
        System.out.println(user7);
    }

    public static User getUserFromFactory(Factory factory, String beanName) {
        Object object = factory.getObject();
        if (object != null && object.getClass().getSimpleName().equals(beanName)) {
            return (User) object;
        }
        return null;
    }

    public static  Factory getFactory(){
        return () -> new User("钱七",25);
    }
}

样例2

定义接口:

package com.shadow.lambda.demo02;

/**
 * <p>@Description  </p>
 * <p>@Author      Shadow.Yu </p>
 * <p>@Date        2023-03-20 </p>
 **/
public interface IGreeting {

    void sayHello(String msg);
}
package com.shadow.lambda.demo02;

/**
 * <p>@Description  </p>
 * <p>@Author      Shadow.Yu </p>
 * <p>@Date        2023-03-20 </p>
 **/
@FunctionalInterface
public interface IMathOperation {
    int operation(int a, int b);
}

测试类:

package com.shadow.lambda.demo02;

/**
 * <p>@Description  Lambda表达式测试类
 * 语法:
 * (parameters) -> {statements;}
 * 或
 * (parameters) -> expression
 * Lambda表达式与函数式接口的抽象函数格式一一对应
 * 前提:必须要有一个函数式接口(@FunctionalInterface)
 * </p>
 * <p>@Author      Shadow.Yu </p>
 * <p>@Date        2023-03-20 </p>
 **/
public class LambdaSyntaxTest {

    public static void main(String[] args) {
        //1.基本格式
        IMathOperation iMathOperation1 = (int a, int b) -> {return a + b;};
        System.out.println(iMathOperation1.operation(1, 2));

        //2.省略大括号
        IGreeting iGreeting = (String msg) -> System.out.println("Hello " + msg);
        iGreeting.sayHello("Lambda");

        //3.省略小括号
        iGreeting = msg -> System.out.println("Hello " + msg);
        iGreeting.sayHello("Lambda2");

        //4.省略return
        IMathOperation iMathOperation2 = (int a, int b) -> a + b;
        System.out.println(iMathOperation2.operation(3, 4));

        //5.省略参数类型和大括号
        IMathOperation iMathOperation3 = (a, b) -> a + b;
        System.out.println(iMathOperation3.operation(4, 5));
    }
}