往期回顾
[Java基础] Java HashMap 的数据结构和底层原理
目录
[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 表达式。