Lambda表达式详解

1. 为什么使用lambda表达式

lambda是一个匿名函数,我们可以吧lambda表达式理解为是一段可以传递的代码。使用它可以写出更简洁,更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。

2. 入门案例

先看一个简单的Java线程中的Runnable接口案例

public void test01(){
        Runnable ri = new Runnable() {
            @Override
            public void run() {
                System.out.println("好好学习,天天向上");
            }
        };
        ri.run();
    }

在这里插入图片描述

再看下使用了Lambda表达式的版本

 public void test02(){
        Runnable r2 = ()-> System.out.println("学会lambda,快乐每一天");
        r2.run();
    }

在这里插入图片描述

相信看到这里,对Lambda表达式的第一印象就是代码怎么这么短,这也就是lambda表达式的特性:简洁。

再看一个案例,比较数的大小

public void test03(){
        Comparator<Integer> comparator = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return Integer.compare(o1,o2);
            }
        };
        int compare = comparator.compare(12, 21);
        System.out.println(compare);
    }

在这里插入图片描述

因为12是小于21的,所以这里返回的是-1;我们再来看看对应的lambda表达式的写法

 public void test04(){
        Comparator<Integer> comparator = (o1,o2)-> Integer.compare(o1,o2);
        int compare = comparator.compare(32,23);
        System.out.println(compare);
    }

在这里插入图片描述

因为32大于23,所以返回值为1;

3. lambda表达式组成

形如以下:

(o1,o2) -> Integer.compare(o1,o2)

左边 -> 右边

  • -> 被称为lambda操作符或箭头操作符
  • 左边:lambda形参列表(其实就是接口中的抽象方法的形参列表)
  • 右边:lambda体 (其实就是重写的抽象方法的方法体)

4. lambda表达式使用

4.1 语法格式一

无参无返回值

public void test01(){
        Runnable ri = new Runnable() {
            @Override
            public void run() {
                System.out.println("好好学习,天天向上");
            }
        };
        ri.run();
    }
 public void test02(){
        Runnable r2 = ()-> {System.out.println("学会lambda,快乐每一天");};
        r2.run();
    }
4.2 语法格式二

需要一个参数但无返回值

public void test05(){
        Consumer<String> consumer = new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        };
        consumer.accept("这一路上走走停停");
    }
public void test06(){
        Consumer<String> consumer = (String s)->{System.out.println(s);};
        consumer.accept("留下少年漂流的痕迹");
    }
4.3 语法格式三

数据类型可以省略,由编译器去推断出,称为“类型推断”

public void test05(){
        Consumer<String> consumer = new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        };
        consumer.accept("这一路上走走停停");
    }
public void test06(){
        Consumer<String> consumer = (s)->{System.out.println(s);}//类型推断
        consumer.accept("留下少年漂流的痕迹");
    }

这里有些类似于使用集合类是前面指明过泛型后,后边不需要再次指明

4.4 语法格式四

lambda若只需要一个参数时,参数的小括号可以省略

public void test05(){
        Consumer<String> consumer = new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        };
        consumer.accept("这一路上走走停停");
    }
public void test06(){
        Consumer<String> consumer = s->{System.out.println(s);}//类型推断
        consumer.accept("留下少年漂流的痕迹");
    }
4.5 语法格式五

lambda需要两个或以上的参数,多条执行语句,并且可以有返回值

   public void test03(){
        Comparator<Integer> comparator = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                System.out.println(o1);
                System.out.println(02);
                return Integer.compare(o1,o2);
            }
        };
        int compare = comparator.compare(12, 21);
        System.out.println(compare);
    }
public void test04(){
     Comparator<Integer> comparator = (o1,o2)-> { 
        System.out.println(o1);
        System.out.println(02);
        return Integer.compare(o1,o2);};
    int compare = comparator.compare(32,23);
    System.out.println(compare);
}
4.6 语法格式六

当lambda体只有一条语句时,return与大括号若有,都可以省略

public void test03(){
        Comparator<Integer> comparator = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return Integer.compare(o1,o2);
            }
        };
        int compare = comparator.compare(12, 21);
        System.out.println(compare);
    }
 public void test04(){
        Comparator<Integer> comparator = (o1,o2)-> Integer.compare(o1,o2);
        int compare = comparator.compare(32,23);
        System.out.println(compare);
    }

5. 总结

lambda接口的实质:作为函数式接口的实例,关键是这个匿名内部类的简化,省略。

  • 78
    点赞
  • 203
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 80
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 80
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叁 柒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值