“Java 8新特性:Lambda表达式与函数引用的详细之道“

简介: “Java 8新特性:Lambda表达式与函数引用的详细之道“

思想概述

面向对象思想: 通过对象的属性和行为来描述事物,强调找对象并与之交互。

函数式编程思想: 通过函数(方法)来解决问题,关注方法的使用和结果。

面向对象思想写代码

  • 传统方法
new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("hello world");
    }
}).start();
  • 使用lambda简化
new Thread(() -> System.out.println("hello world")).start();

Lambda表达式的使用场景

为了简化接口的实现。在某些情况下,我们需要为接口定义实现类或使用匿名内部类来实现接口的抽象方法,但Lambda表达式提供了一种更简单的方式来实现接口

下面是一个示例代码:

package test;
public class Test04 {
    public static void main(String[] args) {
        // 使用Lambda表达式实现接口
        Test test = () -> {
            System.out.println("test");
        };
        test.test();
    }
}
interface Test {
    void test();
}

Lambda表达式对接口的要求

Lambda表达式并不是适用于所有接口的,它只适用于函数式接口。

  • 函数式接口是指接口中只包含一个抽象方法的接口。Lambda表达式可以简化对这种接口的实现。
// 函数式接口
interface Test {
    void test();
}

Lambda表达式的语法

Lambda表达式格式

Lambda表达式格式:(参数类型 参数名称) -> {方法体}

在Lambda表达式中,我们只需要关注两个部分:参数列表和方法体。

  • 参数部分:与接口中定义的抽象方法的参数列表保持一致,包括参数的数量和类型。
    方法体部分:实现接口方法的具体逻辑。如果接口方法有返回值,要注意返回值的处理。

下面是不同类型的Lambda表达式示例:

// 无参
Test test1 = () -> {
    System.out.println("test");
};
// 有参,无返回值
Test test2 = (name, age) -> {
    System.out.println(name + age + "岁了!");
};
// 有参,有返回值
Test test3 = (name, age) -> {
    System.out.println(name + age + "岁了!");
    return age + 1;
};

Lambda表达式的进阶语法

参数部分的精简

  • Lambda表达式中的参数类型可以省略,因为接口方法已经定义了参数类型。

注意:如果省略参数类型,所有参数的类型都必须省略。

// 有参,有返回值
Test test = (name, age) -> {
    System.out.println(name + age + "岁了!");
    return age + 1;
};

参数的小括号

  • 当接口方法只有一个参数时,参数列表的小括号可以省略,但同时也必须省略参数的类型。
// 一个参数
Test test = name -> {
    System.out.println(name + "test");
};

方法体部分的精简

  • 如果方法体中逻辑只有一句语句,大括号可以省略。
Test test = name -> System.out.println(name + "test");

return的精简

  • 如果方法体中只有一个返回语句,大括号和return可以同时省略。
Test test = (a, b) -> a + b;

函数引用

  • Lambda表达式的目的是简化接口的实现。如果Lambda表达式中的逻辑过于复杂,会影响代码的可读性。在这种情况下,可以将逻辑复杂的部分单独编写为方法,并通过函数引用来替代Lambda表达式实现接口的方法。
  • 函数引用允许引用已存在的方法,从而代替Lambda表达式

静态方法的引用

  • 静态方法的引用语法:类名::静态方法

注意:在引用静态方法时,不要添加小括号。引用的方法参数和返回值必须与接口方法一致。

class Calculator {
    public static int calculate(int a, int b) {
        // 复杂的逻辑
        return Math.abs(a - b);
    }
}
interface Test1 {
    int test(int a, int b);
}
// 引用静态方法
Test1 test1 = Calculator::calculate;

非静态方法的引用

  • 非静态方法的引用语法:对象::非静态方法。

注意:在引用非静态方法时,也不要添加小括号。引用的方法参数和返回值必须与接口方法一致。

class Calculator {
    public int calculate(int a, int b) {
        // 复杂的逻辑
        return Math.abs(a - b);
    }
}
interface Test2 {
    int calculate(int a, int b);
}
// 引用非静态方法
Test2 test2 = new Calculator()::calculate;

构造方法的引用

  • 构造方法的引用可以用于简化获取对象的操作。语法:类名::new。

注意:可以根据接口方法的参数来区分引用不同的构造方法。

class Student {
    String name;
    int age;
    public Student() {
        System.out.println("一个Student对象通过无参构造被实例化了");
    }
    public Dog(String name, int age) {
        System.out.println("一个Student对象通过有参构造被实例化了");
        this.name = name;
        this.age = age;
    }
}

后记 👉👉💕💕美好的一天,到此结束,下次继续努力!欲知后续,请看下回分解,写作不易,感谢大家的支持!! 🌹🌹🌹

相关文章
|
2天前
|
自然语言处理 Java
12. 【Java教程】Java 表达式、语句和块
12. 【Java教程】Java 表达式、语句和块
8 0
|
3天前
|
Java
蓝易云 - Java-Lambda表达式
这将输出 "Hello world"。这就是Java中Lambda表达式的基本用法。
24 2
|
4天前
|
存储 安全 Java
深入理解Java堆栈:机制、特性与应用
深入理解Java堆栈:机制、特性与应用
10 1
|
5天前
|
Java 编译器 API
Java语言新特性:探索Java的最新进展
Java语言新特性:探索Java的最新进展
|
5天前
|
安全 Java API
Java的特性
Java的关键特性包括:1) 跨平台能力,依赖JVM在不同系统上运行;2) 面向对象编程,通过类和对象实现代码的高复用和维护性;3) 内置的安全机制,如内存管理和异常处理,确保程序安全;4) 丰富的标准类库,提供各种API简化开发;5) 支持多线程,充分利用CPU资源。学习路线可从基础知识逐步深入到高级特性。
5 1
|
5天前
|
Java 数据处理
Java的运算符与表达式详解
Java的运算符与表达式详解
15 1
|
5天前
|
Java API
Java的Lambda表达式与函数式接口的技术性文章
Java的Lambda表达式与函数式接口的技术性文章
6 0
|
5天前
|
Java API
Java 8新特性之Lambda表达式和Stream API
【5月更文挑战第31天】本文将详细介绍Java 8中的两个重要特性:Lambda表达式和Stream API。通过对比传统编程方式,我们将探讨这两个特性如何简化代码、提高可读性和性能。文章还将通过实例演示如何使用Lambda表达式和Stream API进行集合操作、过滤和转换等任务。
|
存储 并行计算 Java
Java8特性大全(最新版)
Java8特性大全(最新版)
|
5天前
|
Java 开发者 UED
掌握Java多线程编程:从基础到高级
【5月更文挑战第31天】本文深入探讨了Java多线程编程的核心概念,包括线程的创建、生命周期、同步机制以及高级并发工具。通过实际示例和代码片段,读者将学会如何有效地管理和协调线程,以编写高效且稳定的并发应用程序。