一、Lambda 表达式简介
Lambda 表达式是一种简洁的函数式编程方式,用于实现只有一个方法的接口(例如函数式接口)。
基本语法
java
(parameters) -> expression
(parameters) -> { statements; }
- 参数:可以有零个或多个参数。
- 箭头操作符 (
->
):将参数与函数体分隔开。 - 函数体:可以是单行表达式,也可以是包含多行语句的代码块。
示例
1. 使用匿名
java
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("传统方式:Hello World!");
}
};
new Thread(runnable).start();
2. 使用 Lambda 表达式
java
Runnable runnable = () -> System.out.println("Lambda 表达式:Hello World!");
new Thread(runnable).start();
Lambda 表达式让代码更加简洁,提高了可读性。
二、Stream API 简介
Stream 是 Java 8 引入的一个强大的 API,用于处理集合中的数据流。它支持链式操作,允许我们以声明式的方式处理数据。
Stream 的操作类型
- 中间操作 :返回一个新的 Stream,如
filter
、map
、sorted
等。 - 终止操作 :返回一个值或集合,如
collect
、reduce
、count
等。
三、常见的 Stream 操作示例
1. List 转 Set
我们可以通过 Stream
将 List
转换为 Set
,去除重复元素。
java
import java.util.*;
import java.util.stream.Collectors;
public class ListToSetExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 2, 3, 1);
// List 转 Set
Set<Integer> uniqueNumbers = numbers.stream().collect(Collectors.toSet());
System.out.println("去重后的 Set: " + uniqueNumbers);
}
}
输出:
java
去重后的 Set: [1, 2, 3, 4]
2. Map 转 List
通过 Stream
可以将 Map
的键、值或者键值对转为 List
。
java
import java.util.*;
import java.util.stream.Collectors;
public class MapToListExample {
public static void main(String[] args) {
Map<Integer, String> map = new HashMap<>();
map.put(1, "Java");
map.put(2, "Python");
map.put(3, "C++");
// Map 的键转为 List
List<Integer> keys = map.keySet().stream().collect(Collectors.toList());
// Map 的值转为 List
List<String> values = map.values().stream().collect(Collectors.toList());
// Map 的键值对转为 List
List<String> entries = map.entrySet().stream()
.map(entry -> entry.getKey() + "=" + entry.getValue())
.collect(Collectors.toList());
System.out.println("键列表: " + keys);
System.out.println("值列表: " + values);
System.out.println("键值对列表: " + entries);
}
}
输出:
java
键列表: [1, 2, 3]
值列表: [Java, Python, C++]
键值对列表: [1=Java, 2=Python, 3=C++]
3. 过滤(Filter)
通过 filter
方法可以对集合中的元素进行筛选。
java
import java.util.*;
import java.util.stream.Collectors;
public class FilterExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
// 筛选名字长度大于 3 的元素
List<String> filteredNames = names.stream()
.filter(name -> name.length() > 3)
.collect(Collectors.toList());
System.out.println("筛选后的名字: " + filteredNames);
}
}
输出:
java
筛选后的名字: [Alice, Charlie, David]
4. 求和
通过 reduce
方法可以对数字集合进行累加。
java
import java.util.*;
public class SumExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
// 求和
int sum = numbers.stream().reduce(0, Integer::sum);
System.out.println("总和: " + sum);
}
}
输出:
java
总和: 15
5. 分组
通过 Collectors.groupingBy
方法可以对集合中的元素进行分组。
java
import java.util.*;
import java.util.stream.Collectors;
public class GroupingExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Daniel");
// 按名字长度分组
Map<Integer, List<String>> groupedByLength = names.stream()
.collect(Collectors.groupingBy(String::length));
System.out.println("按名字长度分组: " + groupedByLength);
}
}
输出:
java
按名字长度分组: {3=[Bob], 5=[Alice, David], 7=[Charlie, Daniel]}
6. Map 和 Reduce 操作
- Map:将元素映射为另一种类型。
- Reduce:将多个值归约为一个值。
Map 示例
java
import java.util.*;
public class MapExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("alice", "bob", "charlie");
// 将名字转换为大写
List<String> upperCaseNames = names.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println("转换为大写: " + upperCaseNames);
}
}
输出:
java
转换为大写: [ALICE, BOB, CHARLIE]
Reduce 示例
java
import java.util.*;
public class ReduceExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
// 计算乘积
int product = numbers.stream().reduce(1, (a, b) -> a * b);
System.out.println("乘积: " + product);
}
}
输出:
java
乘积: 120