Java—Java8新特性:Lambda表达式(函数式编程)

介绍

Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。这是百度百科的定义,下面我们看下Lambda到底是怎么使用的。
Java8及之后的版本才支持Lambda表达式

Lambda表达式的语法

Lambda表达式由3部分组成:

  • 参数
  • 箭头
  • 代码块

格式:
(参数列表)->{代码块}
解释说明:

  1. ()传入需要传递的参数,没有可以空着,多个参数要用逗号分隔开。
  2. ->将参数传递给方法体{}。
  3. {}重写抽象方法的方法体。

案例

经典案例

传统写法:

public class MainDemo1 {
    public static void main(String[] args) {
        // 匿名内部类
        Runnable task = new Runnable() {
            @Override
            public void run() {
                System.out.println("多线程任务执行!");
            }
        };
        new Thread(task).start(); // 启动线程
    }
}

Lambda写法:

public class MainDemo2 {
    public static void main(String[] args) {
        // 匿名内部类
        Runnable task = ()-> {
                System.out.println("多线程任务执行!");
        };
        new Thread(task).start(); // 启动线程
    }
}

无参无返回值

/**
 * 定义一个厨师Cook接口,内部只有一个无参数、无返回值的makeFood方法
 * 使用Lambda的标准调用invokeCook方法,打印"饭煮好了!!!"
 */
 
public interface Cook {
    void makeFood();
}

public class CookDemo {
    public static void main(String[] args) {
        // 1.传统写法
        invokeCook(new Cook() {
            @Override
            public void makeFood() {
                System.out.println("饭煮好了!!!");
            }
        });

        // 2.Lambda写法
        invokeCook(()->{
            System.out.println("饭煮好了!!!");
        });
    }

    public static void invokeCook(Cook cook) {
        cook.makeFood();
    }
}

有参有返回值

public class Person {
    String name;
    int age;

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

    public Person(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;
    }
}

public class LambdaDemo {
    public static void main(String[] args) {
        // 用数组存储多个Person对象
        Person[] arr = {
                new Person("李冰冰", 30),
                new Person("迪丽热巴", 18),
                new Person("杨幂", 20),
        };

        // 1.传统写法
        // 使用Arrays.sort()对Person对象的年龄进行升序排序(前面-后面)
        /*
        Arrays.sort(arr, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                return o1.getAge() - o2.getAge();
            }
        });
        */

        // 2.Lambda表达式简化匿名内部类
        Arrays.sort(arr, (Person o1, Person o2) -> {
            return o1.getAge() - o2.getAge();
        });

        // 遍历数组
        for (Person person : arr) {
            System.out.println(person);
        }
        // 输出结果
        // Person{name='迪丽热巴', age=18}
        // Person{name='杨幂', age=20}
        // Person{name='李冰冰', age=30}
    }
}

Lambda表达式的优缺点

优点

  1. 简洁,代码量减少

缺点

  1. 可读性比较差
  2. 调试不方便
  3. 只能用在只有一个方法的接口中,局限性大
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值