lambda表达式的使用


一、lambda表达式的格式:

例:(x, y)-> { };

  • 左侧:lambda 表达式的参数列表
  • 中间:lambda 表达式的操作符
  • 右侧:lambda 表达式执行的功能(lambda 体)

二、lambda 表达式的支持:
  • 必须是“函数式接口”才支持lambda表达式
  • 函数式接口(functional interface):只有一个抽象方法的接口,@FunctionalInterface注解可以检查接口是否是函数是接口

三、java 四大内置核心函数式接口:
  • Consumer<T>:消费型接口 void accept(T t);
  • Supplier<T>:供给型接口 T get();
  • Function<T,R>:函数型接口 R apply(T t);
  • Predicate<T>:断言型接口 boolean test(T t);

四、使用 lambda 表达式需注意:(能省则省)

\color{red}{使用 lambda 表达式时,一定要知道抽象方法有几个形参,有没有返回值。}

  • 1.参数列表只有一个参数时,()可以不写。
  • 2.参数列表的参数类型要么全写,要么不写(JVM通过上下文可以推断出数据类型,即类型推断)。
  • 3.lambda 体中有多条语句,必须用{}。
  • 4.lambda 体中只有一条语句,且有返回值,return 和 {} 都不写。
  • 5.lambda 表达式就相当于匿名内部类。

五、下面看具体示例:(建议看完示例,再回味一下上面的四点)

目录结构:


目录结构.png
实在看不懂可以自己写个 Demo 体会一下,全部代码和运行结果如下:

PersonService1.java

package com.wl.service;

@FunctionalInterface
public interface PersonService1 {
    // 无参数,无返回值接口
    void show();
}

PersonService2.java

package com.wl.service;

import com.wl.model.Person;

public interface PersonService2 {
    //有一个参数,无返回值接口
    void show(Person person);
}

PersonService3.java

package com.wl.service;

public interface PersonService3 {
    //有三个参数,无返回值接口
    void show(String name, Integer age, String gender);
}

PersonService4.java

package com.wl.service;

import com.wl.model.Person;

public interface PersonService4 {
    // 有一个参数,有返回值接口
    Person show(Person person);
}

Person.java

package com.wl.model;

public class Person {
    private String name;
    private Integer age;
    private String gender;

    public Person() {
    }

    public Person(String name, Integer age, String gender) {
        super();
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", gender=" + gender + "]";
    }
}

Demo.java

package com.wl.demo;

import com.wl.model.Person;
import com.wl.service.*;

public class Demo {
    public static void main(String[] args) {
        System.out.println("test1()运行结果:");
        test1();    // PersonService1
        System.out.println();

        System.out.println("test2()运行结果:");
        test2();    // PersonService2
        System.out.println();

        System.out.println("test3()运行结果:");
        test3();    // PersonService3
        System.out.println();

        System.out.println("test4()运行结果:");
        test4();    // PersonService4
    }

    /**
     * 无参数,无返回值
     * () -> System.out.println(111);
     */
    public static void test1() {

        PersonService1 personService11 = () -> System.out.println(111);
        personService11.show();

        // 等同于
        PersonService1 personService12 = new PersonService1() {

            @Override
            public void show() {
                System.out.println(222);
            }
        };
        personService12.show();
    }

    /**
     * 一个参数,无返回值,一个参数时,()可以不写
     * (x) -> System.out.println(x);
     */
    public static void test2() {
        PersonService2 personService21 = x -> System.out.println(x);
        personService21.show(new Person("Bob", 21, "男"));

        // 等同于
        PersonService2 personService22 = new PersonService2() {

            @Override
            public void show(Person person) {
                System.out.println(person);
            }
        };
        personService22.show(new Person("aaa", 20, "女"));
    }

    /**
     * 多个参数,无返回值 多条语句,要加{}
     * (x, y, z) -> {
     Person person = new Person(x, y, z);
     System.out.println(person);
     };
     */
    public static void test3() {
        PersonService3 personService31 = (x, y, z) -> {
            Person person = new Person(x, y, z);
            System.out.println(person);
        };
        personService31.show("Tom", 30, "男");

        // 等同于
        PersonService3 personService32 = new PersonService3() {

            @Override
            public void show(String name, Integer age, String gender) {
                Person person = new Person(name, age, gender);
                System.out.println(person);
            }
        };
        personService32.show("bbb", 23, "女");
    }

    /**
     * 一个参数,有返回值
     * x -> x
     */
    public static void test4() {
        PersonService4 personService41 = x -> x;
        Person person1 = personService41.show(new Person("Scott", 25, "男"));

        System.out.println(person1);
        PersonService4 personService42 = new PersonService4() {

            @Override
            public Person show(Person person) {
                return person;
            }
        };
        Person person2 = personService42.show(new Person("ccc", 27, "女"));
        System.out.println(person2);
    }
}

运行结果:


运行结果.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容