·Lambda的基本使用介绍

简介: 这篇文章详细介绍了Java中Lambda表达式的基本概念和使用方法,包括Lambda的基本语法、如何使用Lambda表达式实现接口方法、函数引用以及构造方法的引用,并通过实例代码展示了Lambda表达式的简洁性和实用性。

前言

lambda运行将函数作为一个方法的参数,也就是函数作为参数传递到方法中。使用lambda表达式可以让代码更加简洁。

Lambda表达式的使用场景:用以简化接口实现

1 、简单使用

接口方法的实现


/**
 * @author zyz
 * @version 1.0
 * @data 2023/8/25 11:36
 * @Description: 关于接口实现,可以有很多种方式来实现。
 *               例如:设计接口的实现类、使用匿名内部类。 但是lambda表达式,比这两种方式都简单。
 */
public class LambdaTest {
    public static void main(String[] args) {
        /**
         *  使用lambda表达式实现接口
         */
        TestDemo testDemo = () ->{
            System.out.println("test");
        };
        testDemo.test();

    }

}

@FunctionalInterface
interface TestDemo{
    /**
     * 测试方法
     */
    public void test();

}

2、Lambda的基本语法

/**
 * @author zyz
 * @version 1.0
 * @data 2023/8/25 11:45
 * @Description: 基本语法
 */
public class LambdaTest2 {
    public static void main(String[] args) {
        /**
         *  使用lambda表达式实现接口:
         *      1、无参方法
         *      2、有参 无返回值
         *      3、有参 有返回值
         */

        /**
         * 1、无参方法
         */
        Test01 t1 = () ->{
            System.out.println("我是无参方法");
        };
        t1.test01();

        /**
         * 2、有参 无返回值
         */
        Test02 t2 = (String name,int age) ->{
            System.out.println("我是有参方法:姓名:" + name + ",年龄: " + age);
        };
        t2.test02("张三",18);

        /**
         * 3、有参 有返回值
         */
        Test03 t3 = (name,age) ->{
            int ageAfter = age + 4;
            System.out.println("我是有参 有返回值方法:姓名:" + name + ",年龄: " + age);
            return ageAfter;
        };
        int ageGet = t3.test03("李四",18);
        System.out.println("四年后年龄:" + ageGet);

        /**
         * 精简写法:
         *        1、省略传入参数的类型
         *        2、方法参数列表只有一个,可以省略圆括号
         *        3、当一个方法体中的逻辑,有且只有一句的情况,大括号可以省略
         *        4、如果⼀个方法中唯⼀的⼀条语句是⼀个返回语句, 此时在省略掉大括号的同时, 也必须省略掉return。
         */

        /**
         * 1、省略传入参数的类型
         */
        Test02 t21 = (name,age) ->{
            System.out.println("我是有参方法:姓名:" + name + ",年龄: " + age);
        };
        t21.test02("张三",18);

        /**
         * 2、方法参数列表只有一个,可以省略圆括号
         */
        Test04 t4 = age ->{
            System.out.println("年龄是:" + age);
            return age + 1;
        };
        t4.test04(18);

        /**
         * 3、方法体只有一句的情况,大括号可以省略
         */
        Test02 t22 = (String name,int age) -> System.out.println("我是有参方法:姓名:" + name + ",年龄: " + age);
        t22.test02("张三",18);

        /**
         * 4、如果⼀个方法中唯⼀的⼀条语句是⼀个返回语句, 此时在省略掉大括号的同时, 也必须省略掉return。
         */
        Test04 t41 = age -> age + 1;
        int ageGet1 = t41.test04(18);
        System.out.println("精简写法,年龄加1:" + ageGet1);

    }
}

/**
 * 无参
 */
@FunctionalInterface
interface Test01{
    public void test01();
}

/**
 * 有参 无返回值
 */
@FunctionalInterface
interface Test02{
    public void test02(String name,int age);
}

/**
 * 有参 有返回值
 */
@FunctionalInterface
interface Test03{
    public int test03(String name,int age);
}

/**
 * 只有一个参数
 */
@FunctionalInterface
interface Test04{
    public int test04(int age);

}

3、函数引用

3.1 静态方法/动态方法

/**
 * @author zyz
 * @version 1.0
 * @data 2023/8/25 14:04
 * @Description: 函数引用:
 *                     引用⼀个已经存在的方法,使其替代lambda表达式完成接口的实现
 */
public class LambdaTest3 {
    public static void main(String[] args) {
        /**
         * 1、静态方法的引用。
         *       语法:类::静态方法
         *    注意:
         *       在引用的方法后面,不要添加小括号。
         *       引用的这个方法,参数(数量、类型)和返回值,必须要跟接口中定义的⼀致
         */
        TestDemo01 testDemo = NumberTest::numberTest;
        System.out.println(testDemo.test(5, 3));

        /**
         * 2、非静态方法的引用。
         *       语法:对象::非静态方法
         *    注意:
         *       在引用的方法后面,不要添加小括号。
         *       引用的这个方法,参数(数量、类型)和返回值,必须要跟接口中定义的⼀致
         */
        TestDemo02 testDemo2 =new NumberTest()::numberTest02;
        System.out.println(testDemo2.test(5, 3,2));

    }
}
class NumberTest{
    /**
     * 静态方法
     * @param a
     * @param b
     * @return
     */
    public static int numberTest(int a ,int b){
        if(a > b){
            return a -b;
        }else{
            return b -a ;
        }
    }

    /**
     * 非静态方法的引用
     * @param a
     * @param b
     * @param c
     * @return
     */
    public int numberTest02(int a,int b,int c){
        if(a > b && a > c){
            return b + c;
        }else{
            return a + b + c;
        }
    }

}

interface TestDemo01{
    int test(int a,int b);
}

interface TestDemo02{
    int test(int a,int b,int c);
}

3.2 构造方法的引用

/**
 * @author zyz
 * @version 1.0
 * @Description:
 *              语法:类名::new
 *              注意事项:可以通过接口中的方法的参数, 区分引用不同的构造方法。
 */
public class LambdaTest4 {
    public static void main(String[] args) {
        //lambda表达式实现接口
        GetDog getDog = Dog::new;
        Dog dog = getDog.test();
        System.out.println("无参构造函数:->" + "姓名:" + dog.name + ",年龄:" + dog.age);

        GetDogWithParameter getDogWithParameter = Dog::new;
        Dog dog1 = getDogWithParameter.test("赛虎",11);
        System.out.println("有参构造函数:->" + "姓名:" + dog1.name + ",年龄:" + dog1.age);

    }
}

/**
 * 定义一个函数式接口,用以获取无参的对象
 */
@FunctionalInterface
interface GetDog {
    /**
     * 若此方法仅仅是为了获得一个Dog对象,而且通过无参构造去获取一个Dog对象作为返回值
     *
     * @return
     */
    Dog test();
}

/**
 * 定义一个函数式接口,用以获取有参的对象
 */
@FunctionalInterface
interface GetDogWithParameter {
    /**
     * 若此方法仅仅是为了获得一个Dog对象,而且通过有参构造去获取一个Dog对象作为返回值
     *
     * @param name
     * @param age
     * @return
     */
    Dog test(String name, int age);
}

class Dog {
    String name;
    int age;

    /**
     * 无参构造
     */
    public Dog() {
        System.out.println("一个Dog对象通过无参构造被实例化了");
    }

    /**
     * 有参构造
     *
     * @param name
     * @param age
     */
    public Dog(String name, int age) {
        System.out.println("一个Dog对象通过有参构造被实例化了");
        this.name = name;
        this.age = age;
    }
}
相关文章
|
17天前
|
存储 大数据 Python
案例学Python:filter()函数的用法,高级!
`filter()`函数是Python中处理序列数据的强大工具,它允许我们高效地根据条件过滤元素。通过结合匿名函数、常规函数或直接利用Python的内置逻辑,`filter()`提供了灵活且高效的过滤机制,尤其在大数据处理和内存敏感的应用中展现出其价值。掌握 `filter()`的使用,不仅能提升代码的可读性和效率,还能更好地适应Python的函数式编程风格。
23 2
|
18天前
|
Python
lambda函数简介
lambda函数简介
|
数据安全/隐私保护
零基础VB教程032期:sub过程与function自定义函数的异同专题精讲
零基础VB教程032期:sub过程与function自定义函数的异同专题精讲
|
Python
【Python零基础入门篇 · 10】:集合的相关操作
【Python零基础入门篇 · 10】:集合的相关操作
【Python零基础入门篇 · 10】:集合的相关操作
|
索引 Python
【Python零基础入门篇 · 8】:列表、元组的相关操作(完整版)
【Python零基础入门篇 · 8】:列表、元组的相关操作(完整版)
【Python零基础入门篇 · 8】:列表、元组的相关操作(完整版)
|
索引 Python
【Python零基础入门篇 · 6】:列表、元组的相关操作(完整版)
【Python零基础入门篇 · 6】:列表、元组的相关操作(完整版)
【Python零基础入门篇 · 6】:列表、元组的相关操作(完整版)
|
Java Scala
scala 匿名函数的用法实操
1. => 什么意思 => 匿名函数(Anonymous Functions),表示创建一个函数实例。 比如:(x: Int) => x + 1 和如下JAVA方法表示的含义一样:
118 0
|
存储 算法 C++
C++多元组tuple使用方法?你熟悉吗?快来看看吧
C++多元组tuple使用方法?你熟悉吗?快来看看吧
413 0
|
Python
Python 的 Lambda 函数怎么用?
Python 的 Lambda 函数怎么用?
|
JavaScript 前端开发 Java
别翻了,Lambda 表达式入门,看这篇就够了(1)
别翻了,Lambda 表达式入门,看这篇就够了
154 0
别翻了,Lambda 表达式入门,看这篇就够了(1)