“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;
    }
}

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

相关文章
|
18天前
|
Java API 数据处理
Java新特性:使用Stream API重构你的数据处理
Java新特性:使用Stream API重构你的数据处理
|
1月前
|
存储 Java Go
对比Java学习Go——函数、集合和OOP
Go语言的函数支持声明与调用,具备多返回值、命名返回值等特性,结合`func`关键字与类型后置语法,使函数定义简洁直观。函数可作为一等公民传递、赋值或作为参数,支持匿名函数与闭包。Go通过组合与接口实现面向对象编程,结构体定义数据,方法定义行为,接口实现多态,体现了Go语言的简洁与高效设计。
Java API 开发者
46 0
|
2月前
|
Java 编译器 API
Java Lambda表达式与函数式编程入门
Lambda表达式是Java 8引入的重要特性,简化了函数式编程的实现方式。它通过简洁的语法替代传统的匿名内部类,使代码更清晰、易读。本文深入讲解Lambda表达式的基本语法、函数式接口、方法引用等核心概念,并结合集合操作、线程处理、事件回调等实战案例,帮助开发者掌握现代Java编程技巧。同时,还解析了面试中高频出现的相关问题,助你深入理解其原理与应用场景。
|
2月前
|
安全 Java API
Java中的Lambda表达式:简洁与功能的结合
Java中的Lambda表达式:简洁与功能的结合
365 211
|
2月前
|
安全 Java
Java中的Switch表达式:更简洁的多路分支
Java中的Switch表达式:更简洁的多路分支
439 211
|
2月前
|
Java 编译器
Java 17 Switch表达式:更简洁、更强大的流程控制
Java 17 Switch表达式:更简洁、更强大的流程控制
|
3月前
|
设计模式 数据采集 Java
Java正则表达式的基础知识,进阶至熟练掌握。
通过大量的练习来熟悉它们的识别模式、如何设计模式来解决实际问题,才能够逐步达到熟练掌握。更多的是通过实践、编写代码和解决真实问题来完善技能。在这方面,没有快速的捷径,唯有刻意练习和长时间的代码实践。
83 0
|
Java API Apache
Java 9都有哪些新特性?
Java 9都有哪些新特性?
173 0

热门文章

最新文章