一文教你学会Java Stream API 常用函数

1. 什么是 Stream?

Java 8 引入了 Stream API,提供了一种声明式编程方式,使数据处理更加简洁、易读。Stream 是一个数据流,它不存储数据,而是从数据源(如集合、数组等)获取数据并进行一系列操作。

Stream API 主要有两大类操作:

  • 中间操作(Intermediate Operations):返回新的 Stream,可链式调用。
  • 终端操作(Terminal Operations):触发 Stream 计算,生成结果。

2. Stream 的常用操作

2.1 中间操作(Intermediate Operations)

1. 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]

2. 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]

3. 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]

4. 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]

5. 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]

6. 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]

7. 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]

2.2 终端操作(Terminal Operations)

1. forEach(Consumer) - 遍历

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.stream().forEach(System.out::println);
// 输出:
// Alice
// Bob
// Charlie

2. 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]

3. 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

4. count() - 计数

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
long count = names.stream().count();
System.out.println(count); // 输出:3

5. anyMatch(Predicate) - 任意匹配

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
boolean hasNameStartingWithA = names.stream()
    .anyMatch(name -> name.startsWith("A"));
System.out.println(hasNameStartingWithA); // 输出:true

6. 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

7. 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

3. Stream API 总结

  • 中间操作(返回新的 Stream,可链式调用):

    • 过滤:filter
    • 映射:mapflatMap
    • 排序:sorted
    • 限制:limitskip
    • 去重:distinct
  • 终端操作(触发计算,生成结果):

    • 遍历:forEach
    • 归约:reduce
    • 计数:count
    • 收集:collect
    • 匹配:anyMatchallMatchnoneMatch

Stream API 提供了一种声明式的数据处理方式,使 Java 代码更加简洁、高效。希望本文能帮助你更好地理解并应用 Stream API!

开源运动app

你可能感兴趣的:(java,python,windows)