Java 基础入门 | 第二十章 Java Lambda 表达式

简介: Lambda 表达式,Java 8 发布的最重要新特性。Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。使用 Lambda 表达式可以使代码变的更加简洁紧凑。语法lambda 表达式的语法格式如下:(parameters) -


简介

Lambda 表达式,Java 8 发布的最重要新特性。

Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。

使用 Lambda 表达式可以使代码变的更加简洁紧凑。

语法

lambda 表达式的语法格式如下:

(parameters) ->{ statements; }

image.gif

parameters 为方法参数(可以是无也可以是多个);statements 为方法实现内容;

image.gif编辑

使用Labmda表达式需要函数式编程接口,比如在Runnable接口上我们可以看到@FunctionalInterface注解(标记着这个接口只有一个抽象方法) ,如果自己创建接口,也可以不用此注解,只要保证抽象方法只有一个即可!

image.gif编辑

代码示例

public class Test {
    public static void main(String[] args) {
        Runnable runnable=()-> System.out.println("洛阳泰山!how are you?");
        runnable.run();
    }
}

image.gif

控制台输出

image.gif编辑

代码示例

正常声明一个线程代码

// 用匿名内部类的方式来创建线程
    new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("我是洛阳泰山 记得关注我哦!");
        }
    }).start();

image.gif

用Lambda语法简化后

// 使用Lambda来创建线程
 new Thread(() -> System.out.println("我是洛阳泰山 记得关注我哦!")).start();

image.gif

Thread的构造器

image.gif编辑

由此可见 () -> System.out.println("我是洛阳泰山 记得关注我哦!") 等效与 Runnable target的实例。

函数式编程接口

从上面的代码例子可以看出,我们使用Lambda表达式创建线程的时候,并不关心接口名,方法名,参数名。我们只关注他的参数类型,参数个数,返回值

JDK原生就给我们提供了一些函数式编程接口方便我们去使用,下面是一些常用的接口:

名称 接口 说明
一般函数
Function
一元函数,抽象apply方法
算子函数(输入输出同类型)
UnaryOperator
一元算子,抽象apply方法
谓词函数(输出boolean)
Predicate
一元谓词,抽象test方法
消费者(无返回值)
Consumer

一元消费者函数,抽象accept方法

供应者(无参数只有返回值)
Supplier
无元供应者函数,抽象get方法

简单说明一下:

    • 无元表示无参数,一元表示只有一个入参,二元表示有两个入参。

    二元接口示例

    image.gif编辑

    image.gif编辑

    代码示例

    Function和 Consumer 的使用示例可以参考之前的文章

    import java.util.function.*;
    public class Test {
        public static void main(String args[]){
            // Supplier 无入参,有返回值
            Supplier<String> supplier = () -> "洛阳泰山";
            String s = supplier.get();
            System.out.println(s);
        }
    }

    image.gif

    使用Lambda时,要记住的就两点:

      1. Lambda返回的是接口的实例对象
      2. 有没有参数、参数有多少个、需不需要有返回值、返回值的类型是什么---->选择自己合适的函数式接口

      方法引用

      在学Lambda的时候,还可能会发现一种比较奇怪的写法,例如下面的代码:

      // 方法引用写法
      Consumer<String> consumer = System.out::println;
      consumer.accept("洛阳泰山");

      image.gif

      和下面代码等效

      // 普通的Lambda写法
      Consumer<String> consumer = s -> System.out.println(s);
      consumer.accept("洛阳泰山");

      image.gif

       System.out::println 相当于调用了PrintStream类 (System.out)的println方法

      image.gif编辑

      方法引用又分了几种:

        • 静态方法的方法引用
        • 非静态方法的方法引用
        • 构造函数的方法引用

        代码示例

        import java.util.function.*;
        public class Test {
            public static void main(String args[]){
                    // 静态方法引用--通过类名调用
                    Consumer<String> consumerStatic = Test::say;
                    consumerStatic.accept("输出静态方法!");
                    //实例方法引用--通过实例调用
                    Test test = new Test();
                    Consumer<String> consumer = test::eat;
                    consumer.accept("输出实例方法!");
                    // 构造方法方法引用--无参数
                    Supplier<Test> supplier = Test::new;
                    System.out.println(supplier.get());
            }
            // 静态方法
            public static void say(String name) {
                System.out.println(name);
            }
            // 实例方法
            public void eat(String name) {
                System.out.println(name);
            }
        }

        image.gif

        如果你想更深入的学习lambda的,可以研究下jdk lambda相关的源码是怎么写的,也可百度更多lambda相关的文章,也可持续关注我,后续更新lambda相关的文章知识内容!

        相关文章
        |
        15天前
        |
        Java 开发者 微服务
        Spring Boot 入门:简化 Java Web 开发的强大工具
        Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
        35 6
        Spring Boot 入门:简化 Java Web 开发的强大工具
        |
        11天前
        |
        监控 架构师 Java
        Java虚拟机调优的艺术:从入门到精通####
        本文作为一篇深入浅出的技术指南,旨在为Java开发者揭示JVM调优的神秘面纱,通过剖析其背后的原理、分享实战经验与最佳实践,引领读者踏上从调优新手到高手的进阶之路。不同于传统的摘要概述,本文将以一场虚拟的对话形式,模拟一位经验丰富的架构师向初学者传授JVM调优的心法,激发学习兴趣,同时概括性地介绍文章将探讨的核心议题——性能监控、垃圾回收优化、内存管理及常见问题解决策略。 ####
        |
        16天前
        |
        Java API 开发者
        Java中的Lambda表达式与Stream API的协同作用
        在本文中,我们将探讨Java 8引入的Lambda表达式和Stream API如何改变我们处理集合和数组的方式。Lambda表达式提供了一种简洁的方法来表达代码块,而Stream API则允许我们对数据流进行高级操作,如过滤、映射和归约。通过结合使用这两种技术,我们可以以声明式的方式编写更简洁、更易于理解和维护的代码。本文将介绍Lambda表达式和Stream API的基本概念,并通过示例展示它们在实际项目中的应用。
        |
        15天前
        |
        安全 Java API
        Java中的Lambda表达式:简化代码的现代魔法
        在Java 8的发布中,Lambda表达式的引入无疑是一场编程范式的革命。它不仅让代码变得更加简洁,还使得函数式编程在Java中成为可能。本文将深入探讨Lambda表达式如何改变我们编写和维护Java代码的方式,以及它是如何提升我们编码效率的。
        |
        17天前
        |
        安全 Java API
        Java中的Lambda表达式与Stream API的高效结合####
        探索Java编程中Lambda表达式与Stream API如何携手并进,提升数据处理效率,实现代码简洁性与功能性的双重飞跃。 ####
        24 0
        |
        7月前
        |
        安全 Java
        从零开始学习 Java:简单易懂的入门指南之不可变集合、方法引用(二十六)
        从零开始学习 Java:简单易懂的入门指南之不可变集合、方法引用(二十六)
        |
        6月前
        |
        存储 Java API
        Java——Stream流(1/2):Stream流入门、Stream流的创建(认识Stream、体验Stream流、Stream流的使用步骤、获取Stream流的方法)
        Java——Stream流(1/2):Stream流入门、Stream流的创建(认识Stream、体验Stream流、Stream流的使用步骤、获取Stream流的方法)
        93 0
        |
        Java 索引
        从零开始学习 Java:简单易懂的入门指南之方法(六)
        方法的概念:方法(method)是程序中最小的执行单元注意:方法必须先创建才可以使用,该过程成为方法定义,方法创建后并不是直接可以运行的,需要手动使用后,才执行,该过程成为方法调用
        从零开始学习 Java:简单易懂的入门指南之方法(六)
        Java入门------static关键字和静态属性、方法
        Java入门------static关键字和静态属性、方法
        136 0