JDK8新特性:lambda表达式

文章详细介绍了Java8中的新特性——lambda表达式,包括基本语法、简单应用、精简使用、方法引用和构造方法引用。通过示例代码展示了如何使用lambda简化函数式编程,以及在集合操作和构造方法中的应用。
摘要由CSDN通过智能技术生成

BEGIN

lambda表达式是jdk8的新特性,函数式编程,代替匿名内部类
虽然说我很讨厌这个东西,但是很多大佬都写这个,看不懂可不行,而且大佬们用这个总有他的道理,学一学。

1.lambda基本语法

package com.zky.lambda;

interface Add {
    int add(int a, int b);
}

/**
 *
 * @author: yuan
 * @date: 2023/2/12
 * @Description: lambda基础语法
 */
public class DemoLambda {
    public static void main(String[] args) {
        System.out.println("lambda~~~ ");

        //匿名内部类实现接口的方法
        Add ad = new Add() {
            @Override
            public int add(int a, int b) {
                return a + b;
            }
        };

        System.out.println("匿名内部类:"+ad.add(3, 2));//匿名内部类:5

        /**
         *
         * @author: yuan
         * @date: 2023/2/12
         * @Description: lambda表达式实现接口的方法
         *              ()里面是参数
         *              ->是固定格式
         *              {}里面是函数体,具体实现
         */
        Add ad1 = (int a, int b) -> {
            //函数体
            return a + b;
        };

        System.out.println("lambda:"+ad1.add(3,2));//lambda:5

    }
}

2.lambda的简单运用

package com.zky.lambda;

interface Test1 {

    /**
     * 无参数无返回值
     */
    void test();
}

interface Test2 {

    /**
     * 有一个参数有返回值
     */
    int test(int a);
}

interface Test3 {

    /**
     * 有一个参数无返回值
     */
    void test(int a);
}

interface Test4 {

    /**
     * 有两个参数有返回值
     */
    int test(int a, int b);
}

interface Test5 {

    /**
     * 有两个参数无返回值
     */
    void test(int a, int b);
}

interface Test6 {

    /**
     * 无参数有返回值
     */
    int test();
}

/**
 *
 * @author: yuan
 * @date: 2023/2/12
 * @Description:  lambda的简单运用
 */
public class DemoLambda2 {
    public static void main(String[] args) {
        //1.无参数无返回值
        Test1 test1 = () -> {
            System.out.println("1.无参数无返回值");
        };
        test1.test();

        //2.有一个参数有返回值
        Test2 test2 = (int a) -> {
            return a * 2;
        };
        System.out.println("2.有一个参数有返回值:" + test2.test(3));

        //3.有一个参数无返回值
        Test3 test3 = (int a) -> {
            System.out.println("3.有一个参数无返回值:" + a);
        };
        test3.test(3);

        //4.有两个参数有返回值
        Test4 test4 = (int a, int b) -> {
            return a + b;
        };
        System.out.println("4.有两个参数有返回值:" + test4.test(4, 4));

        //5.有两个参数无返回值
        Test5 test5 = (int a, int b) -> {
            System.out.println("5.有两个参数无返回值:" + (a + b));
        };
        test5.test(2,3);

        //6.无参数有返回值
        Test6 test6 = ()->{
            return 6;
        };
        System.out.println("6.无参数有返回值:"+test6.test());

    }
}

3.lambda表达式的精简使用(省略写法)

package com.zky.lambda;

public class DemoLambda3 {

    /**
     * @author: yuan
     * @date: 2023/2/12
     * @Description: lambd的精简使用
     */
    public static void main(String[] args) {
        //1.参数类型可以省略
        Test2 test1 = (a) -> {
            return a * 2;
        };
        System.out.println("1.参数类型可以省略:" + test1.test(3));

        //2.两个类型的参数都要省略
        Test4 test2 = (a, b) -> {
            return a + b;
        };
        System.out.println("2.两个类型的参数都要省略:" + test2.test(4, 4));

        //3.单参数时,()可以省略
        Test2 test3 = a -> {
            return a * 2;
        };
        System.out.println("3.参数类型可以省略:" + test3.test(3));

        //4.若是方法体只有一个语句,{}也可省略
        Test3 test4 = (a) -> System.out.println("4.若是方法体只有一个语句,{}也可省略:" + a);
        test4.test(4);

        //5.有返回值的函数{}要连着return一同省略
        Test4 test5 = (a, b) -> a + b;
        System.out.println("5.有返回值的函数{}要连着return一同省略:" + test5.test(4, 4));
    }
}

4.lambda的方法引用

package com.zky.lambda;

public class DemoLambda4 {

    /**
     * @author: yuan
     * @date: 2023/2/12
     * @Description: 方法引用
     *              当多个lambda表达式实现的函数相同时,我们可以封装成一个通用方法,然后用lambda表达式调用
     */

    //定义一个方法
    public int sum(int a, int b) {
        return a + b;
    }

    public static int sum2(int a,int b){
        return a + b;
    }

    public static void main(String[] args) {
        //实例化对象
        DemoLambda4 demoLambda4 = new DemoLambda4();

        //用对象和双冒号::调用方法来实现接口
        Test4 test4 = demoLambda4::sum;
        System.out.println("用对象和双冒号::调用方法来实现接口:"+test4.test(2,2));

        //用类名和双冒号::调用静态方法来实现
        Test4 test41 = DemoLambda4::sum2;
        System.out.println("用类名和双冒号::调用方法来实现:"+test41.test(2,2));
    }
}

5.lambda的构造方法引用

先创建一个实体类,添加有参构造方法和无参构造方法

package com.zky.lambda;

/**
 * @author: yuan
 * @date: 2023/2/12
 * @Description: 实体类
 */
public class Dog {

    private String name;

    private int 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;
    }

    public Dog() {
        System.out.println("空参构造方法");
        this.name = "默认";
        this.age = 0;
    }

    public Dog(String name, int age) {
        System.out.println("有参构造方法");
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Dog: {" +
                "name:" + name +
                "  age:" + age +
                "}";
    }
}

构造方法的调用

package com.zky.lambda;

interface DogService {
    Dog getDog();
}

interface DogService2 {
    Dog getDog(String name, int age);
}

/**
 * @author: yuan
 * @date: 2023/2/12
 * @Description: lambda构造方法引用
 */
public class DemoLambda5 {
    public static void main(String[] args) {
        //1.空差构造方法
        DogService dogService1 = () -> {
            return new Dog();
        };
        System.out.println(dogService1.getDog());

        //2.省略写法
        DogService dogService2 = () -> new Dog();
        System.out.println(dogService2.getDog());

        //3.用类名加双冒号调用new (不能用对象)
        DogService dogService3 = Dog::new;
        System.out.println(dogService3.getDog());

        //4.有参构造方法
        DogService2 dogService4 = (String name, int age) -> {
            return new Dog(name, age);
        };
        System.out.println(dogService4.getDog("大黑", 3));

        //5.省略写法
        DogService2 dogService5 = (name, age) -> new Dog(name, age);
        System.out.println(dogService5.getDog("大黑", 3));

        //6.用类名加双冒号调用new
        DogService2 dogService6 = Dog::new;
        System.out.println(dogService6.getDog("大黑",3));
    }
}


6.lambda集合运用

package com.zky.lambda;


import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author: yuan
 * @date: 2023/2/12
 * @Description: 集合运用
 */

public class DemoLambda6 {
    public static void main(String[] args) {
        List<Dog> list = new ArrayList<>();

        list.add(new Dog("大黑",2));
        list.add(new Dog("老黑",3));
        list.add(new Dog("小黑",1));

        //lambda表达式排序
        list.sort((o1,o2)->{
            return o2.getAge()-o1.getAge();
        });
        System.out.println(list);

        //打印list,lambda表达式循环遍历集合
        list.forEach(System.out::println);

    }
}

7.stream运用lambda表达式

(待更新)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值