Java 8 引入了 Stream API,提供了一种声明式编程方式,使数据处理更加简洁、易读。Stream 是一个数据流,它不存储数据,而是从数据源(如集合、数组等)获取数据并进行一系列操作。
Stream API 主要有两大类操作:
filter(Predicate)
- 过滤作用:筛选符合条件的元素。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<String> filteredNames = names.stream()
.filter(name -> name.startsWith("A"))
.collect(Collectors.toList());
System.out.println(filteredNames); // 输出:[Alice]
map(Function)
- 映射作用:将每个元素转换为另一种形式。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> squaredNumbers = numbers.stream()
.map(n -> n * n)
.collect(Collectors.toList());
System.out.println(squaredNumbers); // 输出:[1, 4, 9, 16, 25]
sorted(Comparator)
- 排序作用:对 Stream 进行排序。
List<String> names = Arrays.asList("Charlie", "Alice", "Bob");
List<String> sortedNames = names.stream()
.sorted()
.collect(Collectors.toList());
System.out.println(sortedNames); // 输出:[Alice, Bob, Charlie]
limit(long n)
- 截取前 N 个元素List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> limitedNumbers = numbers.stream()
.limit(3)
.collect(Collectors.toList());
System.out.println(limitedNumbers); // 输出:[1, 2, 3]
skip(long n)
- 跳过前 N 个元素List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> skippedNumbers = numbers.stream()
.skip(2)
.collect(Collectors.toList());
System.out.println(skippedNumbers); // 输出:[3, 4, 5]
distinct()
- 去重List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 4, 4, 5);
List<Integer> distinctNumbers = numbers.stream()
.distinct()
.collect(Collectors.toList());
System.out.println(distinctNumbers); // 输出:[1, 2, 3, 4, 5]
flatMap(Function>)
- 扁平化映射List<List<Integer>> listOfLists = Arrays.asList(
Arrays.asList(1, 2, 3),
Arrays.asList(4, 5),
Arrays.asList(6, 7, 8)
);
List<Integer> flatList = listOfLists.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
System.out.println(flatList); // 输出:[1, 2, 3, 4, 5, 6, 7, 8]
forEach(Consumer)
- 遍历List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.stream().forEach(System.out::println);
// 输出:
// Alice
// Bob
// Charlie
collect(Collector)
- 收集List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
Set<String> nameSet = names.stream().collect(Collectors.toSet());
System.out.println(nameSet); // 输出:[Alice, Bob, Charlie]
reduce(BinaryOperator)
- 归约List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream().reduce(0, Integer::sum);
System.out.println(sum); // 输出:15
count()
- 计数List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
long count = names.stream().count();
System.out.println(count); // 输出:3
anyMatch(Predicate)
- 任意匹配List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
boolean hasNameStartingWithA = names.stream()
.anyMatch(name -> name.startsWith("A"));
System.out.println(hasNameStartingWithA); // 输出:true
allMatch(Predicate)
- 全部匹配List<Integer> numbers = Arrays.asList(2, 4, 6, 8, 10);
boolean allEven = numbers.stream().allMatch(n -> n % 2 == 0);
System.out.println(allEven); // 输出:true
noneMatch(Predicate)
- 无匹配List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
boolean noNegative = numbers.stream().noneMatch(n -> n < 0);
System.out.println(noNegative); // 输出:true
中间操作(返回新的 Stream,可链式调用):
filter
map
、flatMap
sorted
limit
、skip
distinct
终端操作(触发计算,生成结果):
forEach
reduce
count
collect
anyMatch
、allMatch
、noneMatch
Stream API 提供了一种声明式的数据处理方式,使 Java 代码更加简洁、高效。希望本文能帮助你更好地理解并应用 Stream API!
开源运动app