2

死磕Lambda表达式(一):初识Lambda

 2 years ago
source link: https://blog.51cto.com/u_6740480/5166046
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

死磕Lambda表达式(一):初识Lambda

原创

万猫学社 2022-03-31 11:02:41 ©著作权

文章标签 lambda表达式 java 基本语法 文章分类 Java 编程语言 阅读数148

弱小和无知不是生存的障碍,傲慢才是。——《三体》

什么是Lambda表达式

Lambda表达式是表示可传递匿名函数的一种简洁方式,Lambda表达式没有名称,但是有参数列表、函数主体、返回类型,还可能有一个可以抛出的异常列表。它是Java8新增的特性,有了它我们再也不用像之前那样写一堆笨重的匿名类代码了,我们先来体验一下。

与匿名函数对比

下面我们先举个例子,有这样一个表示口罩的类:

package one.more.study;

/**
 * 口罩
 */
public class Mask {
    /**
     * 品牌
     */
    private String brand;
    /**
     * 类型
     */
    private String type;

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
}

再创建一个口罩列表,添加一些口罩对象:

List<Mask> maskList = new ArrayList<>();
maskList.add(new Mask("3M", "KN95"));
maskList.add(new Mask("3M", "FFP2"));
maskList.add(new Mask("Honeywell", "KN95"));
maskList.add(new Mask("Honeywell", "N95"));

现在我们按照品牌给这个口罩列表进行排序。在Java8之前,我们可以用匿名函数进行实现:

maskList.sort(new Comparator<Mask>() {
    @Override
    public int compare(Mask o1, Mask o2) {
        return o1.getBrand().compareTo(o2.getBrand());
    }
});

我们再使用Lambda表达式实现一下:

maskList.sort((Mask o1, Mask o2) -> o1.getBrand().compareTo(o2.getBrand()));

显而易见,使用Lambda表达式以后,代码看起来更清晰更简洁了。假如你还是一脸懵圈的话也没关系,这里我只是想显摆一下Lambda表达式很牛掰,接下来我会一点点地详细讲解清楚。

Lambda表达式的组成

Lambda表达式由三部分组成,以上面的口罩排序的例子为例,如下图:
死磕Lambda表达式(一):初识Lambda_java

  1. 参数列表:本例中是两个Mask对象的参数,采用的是Comparator接口中compare方法的参数。
  2. 箭头->把参数列表和主体分隔为两个部分。
  3. 主体:本例中是把比较口罩品牌的表达式作为Lambda表达式的返回。主体可以修改成另外一种写法,含义是一样的:
maskList.sort((Mask o1, Mask o2) -> {
    return o1.getBrand().compareTo(o2.getBrand());
});

Lambda表达式的基本语法

从上面的例子中的两个种写法中,可以看出Lambda表达式有两种基本语法,分别如下:

  1. (参数列表) -> 表达式
  2. (参数列表) -> { 多条语句 }

只看这两条干瘪的语法,理解起来比较困难,实践出真知,我们来多举几个例子。

Lambda表达式示例

  1. 我们提到的例子,Lambda表达式的参数列表有两个Mask类型的参数,主体是比较两个Mask对象的品牌,返回的是一个int类型。当主体是一个表达式时,不需要return语句,隐含return该表达式的返回值。
(Mask o1, Mask o2) -> o1.getBrand().compareTo(o2.getBrand())
  1. 参数列表中仅有一个Mask类型的参数,返回的是一个String类型,是该Mask对象的品牌信息。
(Mask mask) -> mask.getBrand()
  1. 参数列表中仅有一个Mask类型的参数,返回的是一个boolean类型,是该Mask对象的类型是否为N95。
(Mask mask) -> mask.getType() == "N95"
  1. 参数列表中没有任何参数,返回的是一个int类型。
() -> 996
  1. 参数列表中有两个int类型的参数,但是没有返回值(void)。在主体中可以写多条语句,不过记住要用{}将其包裹。
(int x, int y) -> {
    System.out.println("万猫学社想对你说:");
    System.out.println("第一个参数是:" + x);
    System.out.println("第二个参数是:" + y);
    System.out.println("两数之和是:" + (x + y));
}

看了这么多的例子,是不是撸胳膊挽袖子准备大干一场?别急,检验出真知,我们先简单测试一下。以下的Lambda表达式有哪几个是正确的?

  1. () -> {}
  2. () -> "万猫学社"
  3. () -> { "万猫学社" }
  4. () -> { return "万猫学社"; }
  5. () -> return "万猫学社";

请思考片刻…
.
.
.
死磕Lambda表达式(一):初识Lambda_java_02
.
.
.

宣布答案:第1、2和4个是正确的,第3和5个是错误的。我们来逐个分析一下:

  1. () -> {}:正确,这个Lambda表达式没有参数,也没有任何返回。
  2. () -> "万猫学社":正确,这个Lambda表达式没有参数,主体是一个表达式,返回String类型。
  3. () -> { "万猫学社" }:错误, "万猫学社"是一个表达式,不是一个语句,不能使用{}将其包裹,可以修改为() -> "万猫学社"
  4. () -> { return "万猫学社"; }:正确,这个Lambda表达式没有参数,主体是一个语句,使用{}将其包裹,返回String类型。
  5. () -> return "万猫学社"; :错误, return "万猫学社";是一个语句,不是一个表达式,必须使用{}将其包裹,可以修改为() -> { return "万猫学社"; }

如果你全部答对,恭喜你,你已经基本掌握Lambda表达式的基本语法;如果你有答错的,没关系,重新再看一遍,再复习巩固一下。
学习的路上,我与你一起前行。

  • 收藏
  • 评论
  • 分享
  • 举报

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK