前端小记 前端小记
首页
  • 前端文章

    • HTML
    • CSS
    • JavaScript
    • Vue
  • 学习笔记

    • 《Vue》踩坑笔记
    • TypeScript学习笔记
    • 小程序笔记
    • JavaScript设计模式笔记
  • 工具
  • CentOS
  • Java
  • Docker
  • Linux
  • Maven
  • MySQL
  • 其他
  • 技术文档
  • GitHub部署及推送
  • Nodejs
  • 博客搭建
  • Fullpage全屏轮播插件
  • svn
  • 学习
  • 系统重装
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

sweetheart

前端小记
首页
  • 前端文章

    • HTML
    • CSS
    • JavaScript
    • Vue
  • 学习笔记

    • 《Vue》踩坑笔记
    • TypeScript学习笔记
    • 小程序笔记
    • JavaScript设计模式笔记
  • 工具
  • CentOS
  • Java
  • Docker
  • Linux
  • Maven
  • MySQL
  • 其他
  • 技术文档
  • GitHub部署及推送
  • Nodejs
  • 博客搭建
  • Fullpage全屏轮播插件
  • svn
  • 学习
  • 系统重装
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • centos

  • java

    • Java中日志框架的使用
    • idea上传代码到github的3种方式
    • idea快捷键失效问题解决
    • 解决Eclipse中spring的xml文件下方不显示NameSpaces标签的问题
    • Java集合
    • Java中比较对象大小的两种实现方式
    • String、StringBuffer、StringBuilder的对比
    • Java泛型的使用
    • Java反射机制
    • Lambda表达式
      • 为什么要使用 Lambda 表达式
      • 使用 Lambda 表达式的前后对比
      • Lambda 表达式的基本语法
        • 说明
      • Lambda 表达式语法的六种格式
      • 总结
      • 补充
  • docker

  • Linux

  • maven

  • MySQL

  • 其他

  • 后端
  • java
sweetheart
2019-07-30
目录

Lambda表达式

# Lambda 表达式

# 为什么要使用 Lambda 表达式

Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使 Java 的语言表达能力得到了提升。

# 使用 Lambda 表达式的前后对比

举例一:

    @Test
    public void test(){

        Runnable r1 = new Runnable() {
            @Override
            public void run() {
                System.out.println("我是一个好人");
            }
        };
        r1.run();

        System.out.println("***************使用Lambda表达式后*****************");

        Runnable r2 = () -> System.out.println("我真是一个大好人");
        r2.run();
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

举例二:

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

        System.out.println("******************************");
        //Lambda表达式的写法
        Comparator<Integer> com2 =(o1,o2)  -> Integer.compare(o1,o2);

        int compare2 = com2.compare(40,21);
        System.out.println(compare2);

        System.out.println("******************************");
       //方法引用的写法
        Comparator<Integer> com3 =  Integer :: compare;

        int compare3 = com3.compare(40,21);
        System.out.println(compare3);

    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

# Lambda 表达式的基本语法

# 说明

1.Lambda 表达式:在Java 8 中引入的一种新的语法元素和操作符。这个操作符为 “->” ,该操作符被称为 Lambda 操作符 或箭头操作符。
它将 Lambda 分为两个部分:
左侧:指定了 Lambda 表达式需要的参数列表。
右侧:指定了 Lambda 体,是抽象方法的实现逻辑,也即 Lambda 表达式要执行的功能。    1.以 (o1,o2) -> Integer.compare(o1,o2)举例说明。
2.格式:
      ->:Lambda操作符或者箭头操作符。
      ->的左边:Lambda的形参列表(其实就是接口中的抽象方法的形参列表)。
      ->的右边:Lambda体(其实就是重写的抽象方法的方法体)。
1
2
3
4
5
6
7
8

# Lambda 表达式语法的六种格式

语法格式一:无参,无返回值。
语法格式二:Lambda 需要一个参数,但是没有返回值。
语法格式三:数据类型可以省略,因为可由编译器推断得出,称为“类型推断”。
语法格式四:Lambda 若只需要一个参数时,参数的小括号可以省略。
语法格式五:Lambda 需要两个或以上的参数,多条执行语句,并且可以有返回值。
语法格式六:当 Lambda 体只有一条语句时,return 与大括号若有,都可以省略。
1
2
3
4
5
6

语法格式一代码举例:

     //语法格式一:无参,无返回值
    @Test
    public void test1(){

        Runnable r1 = new Runnable() {
            @Override
            public void run() {
                System.out.println("我是一个好人");
            }
        };
        r1.run();

        System.out.println("*********************改写为Lambda表达式后为*********************");

        Runnable r2 = () -> {
            System.out.println("我真是一个大好人");
        };
        r2.run();

    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

语法格式二代码举例:

    //语法格式二:Lambda 需要一个参数,但是没有返回值。
    @Test
    public void test2(){

        Consumer<String> con = new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        };
          con.accept("我是个好人222");

        System.out.println("***************改写为Lambda表达式后为**********************");
        Consumer<String> con1 = (String s) ->{
            System.out.println(s);
        };
        con1.accept("我真是一个大好人222");

    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

语法格式三代码举例:

     //语法格式三:数据类型可以省略,因为可由编译器推断得出,称为“类型推断”
    @Test
    public void test3(){
        Consumer<String> con1 = (String s) ->{
            System.out.println(s);
        };
        con1.accept("我是个好人333");

        System.out.println("**************************");

        Consumer<String> con2 = (s) ->{
            System.out.println(s);
        };
        con2.accept("我真是一个大好人333");

        ArrayList<String> list = new ArrayList<>(); //这个也是类型推断

        int[] arr = {1,2,3,4,5};  //这也是类型推断
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

语法格式四代码举例:

     //语法格式四:Lambda 若只需要一个参数时,参数的小括号可以省略
    @Test
    public void test4(){
        Consumer<String> con1 = (s) ->{
            System.out.println(s);
        };
        con1.accept("我是一个好人444");

        System.out.println("**************************");
        Consumer<String> con2 = s ->{
            System.out.println(s);
        };
        con2.accept("我真是一个大好人444");

    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

语法格式五代码举例:

    //语法格式五:Lambda 需要两个或以上的参数,多条执行语句,并且可以有返回值
    @Test
    public void test5(){

        Comparator<Integer> com1 = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                System.out.println(o1);
                System.out.println(o2);
                return o1.compareTo(o2);
            }
        };
        System.out.println(com1.compare(16,20));

        System.out.println("*********************************");
        Comparator<Integer> com2 = (o1,o2) -> {
                System.out.println(o1);
                System.out.println(o2);
                return o1.compareTo(o2);
        };
        System.out.println(com2.compare(16,6));

    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

语法格式六代码举例:

    //语法格式六:当 Lambda 体只有一条语句时,return 与大括号若有,都可以省略
    @Test
    public void test6(){
        Comparator<Integer> com1 = (o1,o2) -> {
            return o1.compareTo(o2);
        };
        System.out.println(com1.compare(16,6));

        System.out.println("*******************************");

        Comparator<Integer> com2 = (o1,o2) -> o1.compareTo(o2);

        System.out.println(com2.compare(16,26));


         //另一种表现形式
        Consumer<String> con1 = (s) ->{
            System.out.println(s);
        };
        con1.accept("我是一个好人666");

        System.out.println("*********************************");

        Consumer<String> con2 = (s) -> System.out.println(s);
        con2.accept("我真是一个大好人666");

    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

# 总结

->的左边:Lambda形参列表的参数类型可以省略(类型推断),如果Lambda形参列表只有一个参数,其一对()也可以省略。

->的右边:正常情况下,Lambda体应该使用一对{}包裹,如果Lambda体只有一条执行语句(也可能是return语句),可以省略这一对{}同时省略return关键字。
1
2
3

# 补充

Lambda 表达式的本质:作为函数式接口的实例(接口的具体实现类的对象)

完善页面 (opens new window)
上次更新: 2024-11-28 17:23:47
Java反射机制
Docker三要素

← Java反射机制 Docker三要素→

最近更新
01
git常用操作手册
12-26
02
常用的前端工具库
12-19
03
前端构建工具
12-19
更多文章>
前端小记 版权所有 | Copyright © 2021-2024
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式