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

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

相关文章
|
5天前
|
安全 Java 大数据
探索Java的奇妙世界:语言特性与实际应用
探索Java的奇妙世界:语言特性与实际应用
|
5天前
|
Java 编译器 API
Java基础教程(17)-Java8中的lambda表达式和Stream、Optional
【4月更文挑战第17天】Lambda表达式是Java 8引入的函数式编程特性,允许函数作为参数或返回值。它有简洁的语法:`(parameters) -> expression 或 (parameters) ->{ statements; }`。FunctionalInterface注解用于标记单方法接口,可以用Lambda替换。
|
5天前
|
Java 测试技术 程序员
滚雪球学Java(21):Java正则表达式
【4月更文挑战第10天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
15 2
滚雪球学Java(21):Java正则表达式
|
6天前
|
Java
【Java基础】详解面向对象特性(诸如继承、重载、重写等等)
【Java基础】详解面向对象特性(诸如继承、重载、重写等等)
10 0
|
6天前
|
Java 程序员 编译器
JavaSE&Java8 Lambda 表达式
JavaSE&Java8 Lambda 表达式
|
8天前
|
Java
Java基础之对象的引用
Java基础之对象的引用
6 0
|
10天前
|
并行计算 Java 编译器
Java Lambda表达式简介
Java Lambda表达式简介
14 0
|
11天前
|
Java API
Java Lambda
Java Lambda
15 0
|
机器学习/深度学习 算法 Java
Java基础——【习题二】函数练习题
Java基础——【习题二】函数练习题
Java基础——【习题二】函数练习题
|
Java 数据安全/隐私保护
Java基础——函数
函数是计算机编程中非常重要的部分,是编程中最基本的元素之一。函数表示的是一 种通用的过程,这种过程能够对外界提供服务。例如,现实生活中,ATM 取款机上有不同 的功能,我们可以理解为 ATM 机上具有不同的函数可以调用;我们在 ATM 机上取钱,就 可以理解为我们在 ATM 机上调用了“取钱”函数。在这种关系中,我们是“取钱”函数 的调用者,“取钱”函数为我们提供服务。