知识点:Java 中的 Lambda 表达式

一、Lambda 表达式是什么

Lambda 表达式是 Java 8 引入的一项重要特性,它提供了一种简洁的方式来表示可传递给方法或存储在变量中的代码块。简单来说,Lambda 表达式允许我们用更紧凑的语法表示匿名函数,让代码更加简洁、易读。

二、Lambda 表达式的基本语法

Lambda 表达式的基本语法形式为:(parameters) -> expression 或者 (parameters) -> { statements; }。其中,parameters 是参数列表,可以为空;-> 是 Lambda 运算符,用于分隔参数列表和表达式或语句块;expression 是一个表达式,会被求值并返回;{ statements; } 是一个语句块,包含多条语句。

三、使用场景

(一)作为函数式接口的实例

函数式接口是指只包含一个抽象方法的接口。Java 8 中提供了许多函数式接口,如 RunnableComparator 等。Lambda 表达式可以很方便地作为这些函数式接口的实例。

auto 复制代码
// 使用匿名内部类实现 Runnable 接口
Runnable r1 = new Runnable() {
    @Override
    public void run() {
        System.out.println("使用匿名内部类实现 Runnable");
    }
};

// 使用 Lambda 表达式实现 Runnable 接口
Runnable r2 = () -> System.out.println("使用 Lambda 表达式实现 Runnable");

public class LambdaRunnableExample {
    public static void main(String[] args) {
        new Thread(r1).start();
        new Thread(r2).start();
    }
}

在这个例子中,r1 使用匿名内部类实现 Runnable 接口,r2 使用 Lambda 表达式实现 Runnable 接口,Lambda 表达式的语法更加简洁。

(二)作为方法参数

许多 Java 8 的 API 方法接受函数式接口作为参数,这时可以直接传递 Lambda 表达式。例如,Collections.sort 方法可以接受一个 Comparator 接口的实例来定义排序规则。

auto 复制代码
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class LambdaComparatorExample {
    public static void main(String[] args) {
        List<Integer> numbers = new ArrayList<>();
        numbers.add(3);
        numbers.add(1);
        numbers.add(2);

        // 使用 Lambda 表达式作为 Comparator 参数进行排序
        Collections.sort(numbers, (a, b) -> a - b);

        System.out.println(numbers); 
    }
}

这里 (a, b) -> a - b 是一个 Lambda 表达式,作为 Comparator 的实现传递给 Collections.sort 方法,定义了升序排序的规则。

(三)与 Stream API 结合使用

Stream API 是 Java 8 中用于处理集合数据的强大工具,Lambda 表达式与 Stream API 结合可以实现高效、简洁的数据处理。

auto 复制代码
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class LambdaStreamExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

        // 使用 Stream API 和 Lambda 表达式进行数据处理
        List<Integer> squaredNumbers = numbers.stream()
              .map(n -> n * n)
              .collect(Collectors.toList());

        System.out.println(squaredNumbers); 
    }
}

在这个例子中,n -> n * n 是一个 Lambda 表达式,作为 map 方法的参数,对 Stream 中的每个元素进行平方操作。

四、自定义 Lambda

除了使用 Java 内置的函数式接口,我们还可以自定义函数式接口,并使用 Lambda 表达式来实现它。

(一)自定义函数式接口

auto 复制代码
@FunctionalInterface
interface StringTransformer {
    String transform(String input);
}

这里使用 @FunctionalInterface 注解标识这是一个函数式接口,它只包含一个抽象方法 transform,该方法接受一个 String 类型的参数并返回一个 String

(二)使用自定义函数式接口和 Lambda 表达式

auto 复制代码
public class CustomLambdaExample {
    public static void main(String[] args) {
        StringTransformer toUpperCaseTransformer = input -> input.toUpperCase();
        StringTransformer reverseTransformer = input -> {
            StringBuilder sb = new StringBuilder(input);
            return sb.reverse().toString();
        };

        String originalString = "hello";
        String upperCaseString = applyTransformer(originalString, toUpperCaseTransformer);
        String reversedString = applyTransformer(originalString, reverseTransformer);

        System.out.println("转大写: " + upperCaseString);
        System.out.println("反转: " + reversedString);
    }

    public static String applyTransformer(String input, StringTransformer transformer) {
        return transformer.transform(input);
    }
}

在上述代码中,我们定义了两个 Lambda 表达式来实现 StringTransformer 接口。toUpperCaseTransformer 将字符串转换为大写,reverseTransformer 将字符串反转。applyTransformer 方法接受一个字符串和一个 StringTransformer 实例,通过调用 transform 方法对字符串进行相应的转换操作。

通过自定义 Lambda,我们可以根据具体的业务需求灵活地定义函数式接口,并使用简洁的 Lambda 表达式来实现其功能,进一步提升代码的灵活性和简洁性。Lambda 表达式为 Java 编程带来了函数式编程的风格,使得代码更加简洁、灵活,提高了开发效率。掌握 Lambda 表达式对于深入学习和使用 Java 8 及后续版本的新特性至关重要。

相关推荐
我命由我123451 小时前
35.Java线程池(线程池概述、线程池的架构、线程池的种类与创建、线程池的底层原理、线程池的工作流程、线程池的拒绝策略、自定义线程池)
java·服务器·开发语言·jvm·后端·架构·java-ee
CopyLower2 小时前
分布式ID生成方案的深度解析与Java实现
java·开发语言·分布式
whoarethenext4 小时前
qt的基本使用
开发语言·c++·后端·qt
m0_684598535 小时前
如何开发英语在线训练小程序:从0到1的详细步骤
java·微信小程序·小程序·小程序开发
ml130185288745 小时前
开发一个环保回收小程序需要哪些功能?环保回收小程序
java·大数据·微信小程序·小程序·开源软件
zybishe6 小时前
免费送源码:Java+ssm+MySQL 酒店预订管理系统的设计与实现 计算机毕业设计原创定制
java·大数据·python·mysql·微信小程序·php·课程设计
anlogic7 小时前
Java基础 4.12
java·开发语言
weisian1518 小时前
Java常用工具算法-7--秘钥托管云服务2(阿里云 KMS)
java·安全·阿里云
草捏子8 小时前
主从延迟导致数据读不到?手把手教你架构级解决方案
后端
橘猫云计算机设计8 小时前
基于Python电影数据的实时分析可视化系统(源码+lw+部署文档+讲解),源码可白嫖!
数据库·后端·python·信息可视化·小程序·毕业设计