[Java基础] Lambda 表达式

往期回顾

Java基础 流程控制

Java基础 运算符

Java基础 基本数据类型

Java基础 Java HashMap 的数据结构和底层原理

Java基础 面向对象编程

Java基础 异常处理机制

Java基础 集合框架

Java基础 输入输出流

目录

概述

[Lambda 表达式的基本语法](#Lambda 表达式的基本语法)

应用场景

并发编程

集合操作

事件处理

排序

函数式接口

数据处理

自定义函数式接口

总结

概述

Java 8 引入了 Lambda 表达式,这是一种简化代码、提高可读性和表达力的新特性。Lambda 表达式允许你以函数的形式传递代码块,从而实现函数式编程的一些概念。下面是对 Lambda 表达式的详细介绍以及一些实战案例。

Lambda 表达式的基本语法

Lambda 表达式的基本语法如下:

复制代码
(parameters) -> expression

或者

复制代码
(parameters) -> { statements; }

组件说明

  • 参数列表:可以有零个或多个参数,参数类型可以省略(编译器会根据上下文推断类型)。
  • 箭头 :-> 将参数列表与主体部分分开。
  • 主体 :可以是一个表达式或一个代码块。如果主体是一个表达式,则不需要使用大括号;如果是代码块,则需要使用大括号 {} 包围。

应用场景

Java Lambda 表达式在多种场景下都非常有用,可以显著提高代码的简洁性和可读性。以下是 Lambda 表达式的一些常见应用场景:

并发编程

在多线程编程中,Lambda 表达式可以简化 Runnable 和 Callable 的实现。

示例:使用 Lambda 表达式创建线程

复制代码
public class LambdaRunnableExample {
    public static void main(String[] args) {
        // 传统方式
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("传统方式运行线程");
            }
        }).start();

        // 使用 Lambda 表达式
        new Thread(() -> {
            System.out.println("使用 Lambda 表达式运行线程");
        }).start();
    }
}

集合操作

Lambda 表达式与 Stream API 结合使用,可以高效地处理集合数据。

示例:使用 Stream API 过滤和转换列表

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

public class StreamExample {
    public static void main(String[] args) {
        List<String> names = new ArrayList<>();
        names.add("Alice");
        names.add("Bob");
        names.add("Charlie");
        names.add("David");

        // 使用 Stream API 过滤并转换列表
        List<String> upperCaseNames = names.stream()
                .filter(name -> name.length() > 3)
                .map(String::toUpperCase)
                .collect(Collectors.toList());

        System.out.println("过滤并转换后的列表: " + upperCaseNames);  // 输出: [ALICE, CHARLIE, DAVID]
    }
}

事件处理

在图形用户界面(GUI)编程中,Lambda 表达式可以简化事件处理器的实现。

示例:使用 Lambda 表达式处理按钮点击事件

复制代码
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class LambdaEventExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Lambda Event Example");
        JButton button = new JButton("Click me");

        // 传统方式
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("传统方式处理点击事件");
            }
        });

        // 使用 Lambda 表达式
        button.addActionListener(e -> System.out.println("使用 Lambda 表达式处理点击事件"));

        frame.add(button);
        frame.setSize(300, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

排序

Lambda 表达式可以简化 Comparator 的实现,用于对集合进行排序。

示例:使用 Lambda 表达式实现 Comparator

复制代码
import java.util.Arrays;
import java.util.List;

public class LambdaComparatorExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");

        // 传统方式
        names.sort(new java.util.Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                return s1.compareTo(s2);
            }
        });
        System.out.println("传统方式排序: " + names);

        // 使用 Lambda 表达式
        names.sort((s1, s2) -> s1.compareTo(s2));
        System.out.println("使用 Lambda 表达式排序: " + names);
    }
}

函数式接口

Lambda 表达式可以实现函数式接口,如 Function、Predicate、Consumer 和 Supplier 等。

示例:使用 Lambda 表达式实现 Function

复制代码
import java.util.function.Function;

public class LambdaFunctionExample {
    public static void main(String[] args) {
        // 定义一个 Function,将字符串转换为大写
        Function<String, String> toUpperCase = s -> s.toUpperCase();

        // 使用 Function
        String result = toUpperCase.apply("hello world");
        System.out.println(result);  // 输出: HELLO WORLD
    }
}

数据处理

Lambda 表达式可以用于数据处理任务,如过滤、映射和归约操作。

示例:使用 Stream API 进行数据处理

复制代码
import java.util.Arrays;
import java.util.List;
import java.util.Optional;

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

        // 找到第一个偶数
        Optional<Integer> firstEven = numbers.stream()
                .filter(n -> n % 2 == 0)
                .findFirst();

        firstEven.ifPresent(System.out::println);  // 输出: 2

        // 计算所有偶数的平方和
        int sumOfSquares = numbers.stream()
                .filter(n -> n % 2 == 0)
                .map(n -> n * n)
                .reduce(0, Integer::sum);

        System.out.println("偶数的平方和: " + sumOfSquares);  // 输出: 220
    }
}

自定义函数式接口

你可以定义自己的函数式接口,并使用 Lambda 表达式实现它们。

示例:自定义函数式接口

复制代码
@FunctionalInterface
interface MyFunction {
    int apply(int x, int y);
}

public class CustomFunctionExample {
    public static void main(String[] args) {
        // 定义一个 Lambda 表达式
        MyFunction add = (x, y) -> x + y;

        // 使用 Lambda 表达式
        int result = add.apply(5, 3);
        System.out.println("5 + 3 = " + result);  // 输出: 5 + 3 = 8
    }
}

总结

Lambda 表达式在多种场景下都非常有用,可以简化代码、提高可读性和表达力。通过上述示例,你可以看到 Lambda 表达式在并发编程、集合操作、事件处理、排序、函数式接口、数据处理和自定义函数式接口等场景中的应用。希望这些示例能帮助你更好地理解和使用 Lambda 表达式。

相关推荐
2301_32241428041 小时前
基于SpringBoot+Vue的休闲零食超市管理系统的设计与实现59004-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·vue.js·spring boot·redis·mysql·决策树·推荐算法
懂点Tech2 小时前
ctfshow MISC入门图片篇(信息附加):misc41解题思路
开发语言·python
金銀銅鐵3 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(上)
java·后端·ai编程
catchadmin3 小时前
PHP 8.7 协程新提案 让跨协程代码共享请求身份
开发语言·php
福建佰胜张工4 小时前
SMC 薄型气爪 MHF2-16D1 深度解析:平行开闭、低剖面结构在自动化装配中的选型与落地
java·服务器·安全·自动化
念何架构之路4 小时前
go-grpc设计思想
开发语言·后端·golang
catoop4 小时前
API Key 设计与安全生成方案:结构拆解、数据库设计与 Java 实现
java·数据库·安全
system_error_x4 小时前
SpringBoot 集成 Thymeleaf 简洁入门
java·spring boot·后端
酷炫码神4 小时前
Day 10|Pinia 状态管理:把散落在各组件的数据,收进一个全局仓库
android·开发语言·javascript
驭渊的小故事5 小时前
Spring AI Alibaba 实战:从maven依赖治理到声明式工具调用
java·人工智能·spring